为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
HUWWW 2023-07-26 17:11:25
我正在尝试在 Go 中为 sancov 文件格式实现一个简单的解析器https://clang.llvm.org/docs/SanitizerCoverage.html#sancov-data-format格式基本上是前 8 个字节是一个幻值 0xC0BFFFFFFFFFFF64 或 0xC0BFFFFFFFFFFF32 幻值的最后一个字节决定剩余偏移量的大小。但是我不知道如何将十六进制值与 Go 中的字节值进行比较package mainimport (    "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.govalue: 64ffffffffffbfc0 read 8 bytesvalue: 3b10004001000000 read 8 bytesvalue: 7c10004001000000 read 8 bytes
查看完整描述

2 回答

?
狐的传说

TA贡献1804条经验 获得超3个赞

将从文件中读取的数据与[]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字节数据。



查看完整回答
反对 回复 2023-07-26
?
红颜莎娜

TA贡献1842条经验 获得超12个赞

您可以比较数组:


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

    }

}


查看完整回答
反对 回复 2023-07-26
  • 2 回答
  • 0 关注
  • 119 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信