сопоставление двоичных данных с шестнадцатеричным значением в го - PullRequest
0 голосов
/ 29 сентября 2019

Я пытаюсь реализовать в 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

Ответы [ 2 ]

2 голосов
/ 29 сентября 2019

Сравните данные, прочитанные из файла, с []byte, содержащим магическое значение.

Объявите переменную уровня пакета с магическим значением:

 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 байтов данных.

0 голосов
/ 29 сентября 2019

Вы можете сравнить массивы:

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")
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...