猿问

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

我正在尝试在 Go 中为 sancov 文件格式实现一个简单的解析器https://clang.llvm.org/docs/SanitizerCoverage.html#sancov-data-format


格式基本上是前 8 个字节是一个幻值 0xC0BFFFFFFFFFFF64 或 0xC0BFFFFFFFFFFF32 幻值的最后一个字节决定剩余偏移量的大小。


但是我不知道如何将十六进制值与 Go 中的字节值进行比较


package main


import (

    "fmt"

    "log"

    "os"

)


func main() {

    path := "test.exe.16900.sancov"


    f, err := os.Open(path)

    if err != nil {

        log.Fatal("Error while opening file", err)

    }


    for {

        data := make([]byte, 8)

        // ignoring errors for now

        bytesread, _ := f.Read(data)

        if bytesread == 0 {

            break

        }

        fmt.Printf("value: %x read %d bytes\n", data, bytesread)


        //"64ffffffffffbfc0"

        if data == 0xC0BFFFFFFFFFFF64 { // this is not valid 

            fmt.Println("64 bit header found")

        }


    }

}

我在这里缺少什么?


输出(删除最后一个 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


HUWWW
浏览 120回答 2
2回答

狐的传说

将从文件中读取的数据与[]byte包含魔术值的数据进行比较。使用 magic 值声明一个包级变量: var magicValue = []byte{0x64,0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xc0}与bytes.Equal比较: 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")}使用io.ReadFull确保读取8字节数据。

红颜莎娜

您可以比较数组:package mainimport (    "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")    }}
随时随地看视频慕课网APP

相关分类

Go
我要回答