Parsing binary.Read()未在结构中生成预期值

Parsing binary.Read()未在结构中生成预期值,parsing,go,binary,Parsing,Go,Binary,我正在尝试制作一个MOBI文件解析器,但在尝试使用binary.Read()将一些二进制文件解析为结构时遇到了一些问题 我认为这是一个对齐问题,但我不知道为什么我没有得到预期的值。我通过libmobi运行了.mobi文件来测试代码的输出,并检查了.mobi的二进制文件,以验证我没有发疯,libmobi代码没有做奇怪的事情(事实并非如此) 下面是一个简单的例子: package main import ( "bytes" "encoding/binary" "fmt" )

我正在尝试制作一个MOBI文件解析器,但在尝试使用binary.Read()将一些二进制文件解析为结构时遇到了一些问题

我认为这是一个对齐问题,但我不知道为什么我没有得到预期的值。我通过libmobi运行了.mobi文件来测试代码的输出,并检查了.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...
}
任何帮助都将不胜感激

编辑:以下是在
book.mobi
上执行
xxd
操作的十六进制字节:


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

是的,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...
}

您的
testBytes
数字是大端数字。你为什么期望小endian值?啊,哇。非常感谢。我知道我离问题太近了,错过了一些简单的东西