亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

將二進制數據與 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條經驗 獲得超13個贊

您可以比較數組:


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 關注
  • 168 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號