将二进制数据与go中的十六进制值匹配
我正在尝试用Go为sancov文件格式实现一个简单的解析器 格式基本上是前8个字节是一个魔术值0xc0bffffffff64或0xc0bffffffffff32,魔术值的最后一个字节决定剩余偏移量的大小 然而,我不知道如何将十六进制值与Go中的字节值进行比较 包干管 进口 fmt 日志 操作系统 func main{ 路径:=test.exe.16900.sancov f、 错误:=os.Openpath 如果错误!=零{ log.FatalError打开文件时出错,错误 } 为了{ 数据:=make[]字节,8 //暂时忽略错误 字节读取,:=f.读取数据 如果bytesread==0{ 打破 } fmt.Printfvalue:%x读取%d字节\n、数据、字节读取 //64FFFFFFFFBFC0 如果数据==0xC0BFFFFFFFFF64{//这是无效的 找到fmt.Println64位标头 } } } 我错过了什么 删除最后一条if语句时的输出如下将二进制数据与go中的十六进制值匹配,go,Go,我正在尝试用Go为sancov文件格式实现一个简单的解析器 格式基本上是前8个字节是一个魔术值0xc0bffffffff64或0xc0bffffffffff32,魔术值的最后一个字节决定剩余偏移量的大小 然而,我不知道如何将十六进制值与Go中的字节值进行比较 包干管 进口 fmt 日志 操作系统 func main{ 路径:=test.exe.16900.sancov f、 错误:=os.Openpath 如果错误!=零{ log.FatalError打开文件时出错,错误 } 为了{ 数据:=m
PS C:\Users\user\src\test> go run main.go
value: 64ffffffffffbfc0 read 8 bytes
value: 3b10004001000000 read 8 bytes
value: 7c10004001000000 read 8 bytes
您可以比较阵列:
package main
import (
"fmt"
"io"
"log"
"os"
"bytes"
)
var magicNumber = []byte{0x64, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xc0}
func main() {
path := "test.exe.16900.sancov"
f, err := os.Open(path)
if err != nil {
log.Fatal("Error while opening file", err)
}
data := make([]byte, len(magicNumber))
if _, err := io.ReadFull(f, data); err != nil {
log.Fatal(err)
}
fmt.Printf("%s\n", data)
if bytes.Equal(data, magicNumber) {
fmt.Println("header found")
}
}
将从文件读取的数据与包含魔术值的[]字节进行比较 声明具有魔术值的包级别变量:
var magicValue = []byte{0x64,0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xc0}
与之相比:
用于确保读取了8字节的数据。这会导致以下错误:无效操作:数据==魔术数字不匹配类型[]字节和[32]字节不理解,仍然不工作。我在输出中添加了标题和幻数的打印语句,这是您更改的不匹配值的结果:64FFFFFFFFBFC0读取8字节头->64FFFFFFFFBFC000000000000000000幻数->36346666666666666662666330值:3b10004001000000读取8字节头->3B10004001000000000000000000000000000000000幻数->36346666666666666666666330值:7c10004001000000读取8字节标题->7C100040010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000?比较字节。
data := make([]byte, len(magicValue))
_, err := io.ReadFull(f, data)
if err != nil {
// handle error
}
if bytes.Equal(data, magicValue) {
fmt.Println("64 bit header found")
}