binary.Read () не производит ожидаемые значения в структуре - PullRequest
0 голосов
/ 09 октября 2018

Я пытаюсь создать синтаксический анализатор файлов MOBI, и у меня возникла небольшая проблема с попыткой разобрать некоторые двоичные файлы в структуру с помощью binary.Read ().

I 'Я думаю, что это проблема выравнивания, но я в недоумении, почему я не получаю ожидаемые значения.Я запустил файл .mobi через libmobi, чтобы проверить вывод моего кода, а также проверил двоичный файл .mobi, чтобы убедиться, что я не сумасшедший и код libmobi не делал ничего странного (чтоне).

Вот урезанный пример:

package main

import (
    "bytes"
    "encoding/binary"
    "fmt"
)

type Header struct {
    Type        [4]byte
    Creator     [4]byte
    Uid         uint32
    Next        uint32
    RecordCount uint16
}

func main() {
    testBytes := []byte{66, 79, 79, 75, 77, 79, 66, 73, 0, 0, 1, 17, 0, 0, 0, 0, 0, 136}

    h := Header{}
    buf := bytes.NewBuffer(testBytes)
    binary.Read(buf, binary.LittleEndian, &h)

    fmt.Printf("%s\n", h.Type)    // BOOK, as expected
    fmt.Printf("%s\n", h.Creator) // MOBI, as expected
    fmt.Printf("%d\n", h.Next)    // 0, as expected

    fmt.Printf("%d\n", h.Uid)
    // expecting Uid to be 273, but it's 285278208...
    fmt.Printf("%d\n", h.RecordCount)
    // expecting RecordCount to be 136, but it's 34816...
}

Любая помощь будет принята с благодарностью!

РЕДАКТИРОВАТЬ: вот шестнадцатеричные байты от выполнения xxd вкл book.mobi:

424f 4f4b 4d4f 4249 0000 0111 0000 0000 0088

1 Ответ

0 голосов
/ 09 октября 2018

Да, BigEndian работает намного лучше

package main

import (
    "bytes"
    "encoding/binary"
    "fmt"
)

type Header struct {
    Type        [4]byte
    Creator     [4]byte
    Uid         uint32
    Next        uint32
    RecordCount uint16
}

func main() {
    testBytes := []byte{66, 79, 79, 75, 77, 79, 66, 73, 0, 0, 1, 17, 0, 0, 0, 0, 0, 136}

    h := Header{}
    buf := bytes.NewBuffer(testBytes)
    binary.Read(buf, binary.BigEndian, &h)

    fmt.Printf("%s\n", h.Type)    // BOOK, as expected
    fmt.Printf("%s\n", h.Creator) // MOBI, as expected
    fmt.Printf("%d\n", h.Next)    // 0, as expected

    fmt.Printf("%d\n", h.Uid)
    // expecting Uid to be 273, but it's 285278208...
    fmt.Printf("%d\n", h.RecordCount)
    // expecting RecordCount to be 136, but it's 34816...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...