关于golang在数据恢复领域的应用, 如今平台越来越多, linux系服务器下的业务爆发, 桌面系统的业务基本让市场上abc软件基本消灭光了.
golang虽然主要的开发方向不在于系统底层, 这也不是golang语言的优势所在, 但是其便利的跨平台交叉编译特性, 不需要多余的配置, 这是我对选择开发语言的基本要求, 所以还是值得去研究一下.
package main
import (
"fmt"
"os"
"strconv"
)
const sectorSize = 512
func main() {
if len(os.Args) < 2 {
fmt.Println("Usage: readsector <device> <lba>")
return
}
device := os.Args[1]
lba:= int64(0)
if len(os.Args) > 2 {
var err error
lba, err = strconv.ParseInt(os.Args[2], 10, 64)
if err != nil {
fmt.Printf("Invalid lba: %s\n", err.Error())
return
}
}
f, err := os.OpenFile(device, os.O_RDONLY, os.ModeExclusive)
if err != nil {
fmt.Printf("Cannot open device: %s\n", err.Error())
return
}
defer f.Close()
buffer := make([]byte, sectorSize)
_, err = f.ReadAt(buffer, lba*512*sectorSize)
if err != nil {
fmt.Printf("Cannot read sector: %s\n", err.Error())
return
}
for i := range buffer{
fmt.Printf("%X ", string(buffer[i:i+1]))
if (i + 1) % 16 == 0 { // 打印新行之前检查最后一个字节
o := i / 16 * 16 // 计算该行的起始偏移量
if buffer[o] < 32 || buffer[o] > 126 {
fmt.Print("\n") // 如果第一个字节不可打印,则只打印新行
} else {
bb := buffer[o:o+16]
conv(&bb)
fmt.Printf(" %s\n", string(bb)) // 打印转换后的缓冲区
}
}
}
}
func conv(buf *[]byte){
for i := range *buf {
if (*buf)[i]<32 || (*buf)[i]>126{
(*buf)[i] = 32
}
}
}