将二进制数据与go中的十六进制值匹配

将二进制数据与go中的十六进制值匹配,go,Go,我正在尝试用Go为sancov文件格式实现一个简单的解析器 格式基本上是前8个字节是一个魔术值0xc0bffffffff64或0xc0bffffffffff32,魔术值的最后一个字节决定剩余偏移量的大小 然而,我不知道如何将十六进制值与Go中的字节值进行比较 包干管 进口 fmt 日志 操作系统 func main{ 路径:=test.exe.16900.sancov f、 错误:=os.Openpath 如果错误!=零{ log.FatalError打开文件时出错,错误 } 为了{ 数据:=m

我正在尝试用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语句时的输出如下

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")
}