在最近的一个 Go 项目中,我需要读取一个由 Python 生成的二进制数据文件,但由于填充,binary.Read在 Go 中无法正确读取它。以下是我的问题的最小示例。
我处理的结构是否具有以下格式
type Index struct{
A int32
B int32
C int32
D int64
}
如您所见,结构体的大小为 4+4+4+8=20,但 Python 额外添加了 4 个字节用于对齐。所以大小实际上是24。
下面是我用来编写这个结构体的可运行 Python 代码:
#!/usr/bin/env python
# encoding=utf8
import struct
if __name__ == '__main__':
data = range(1, 13)
format = 'iiiq' * 3
content = struct.pack(format, *data)
with open('index.bin', 'wb') as f:
f.write(content)
的iiiq格式的装置有三个32位的整数,并且在结构中,其是与相同的一个64位的整数Index余前面定义结构。运行此代码将生成一个名为index.bin72的文件,它等于 24 * 3。
下面是我用来阅读的 Go 代码index.bin:
package main
import (
"encoding/binary"
"fmt"
"os"
"io"
"unsafe"
)
type Index struct {
A int32
B int32
C int32
D int64
}
func main() {
indexSize := unsafe.Sizeof(Index{})
fp, _ := os.Open("index.bin")
defer fp.Close()
info, _ := fp.Stat()
fileSize := info.Size()
entryCnt := fileSize / int64(indexSize)
fmt.Printf("entry cnt: %d\n", entryCnt)
readSlice := make([]Index, entryCnt)
reader := io.Reader(fp)
_ = binary.Read(reader, binary.LittleEndian, &readSlice)
fmt.Printf("After read:\n%#v\n", readSlice)
}
这是输出:
entry cnt: 3
After read:
[]main.Index{main.Index{A:1, B:2, C:3, D:17179869184}, main.Index{A:0, B:5, C:6, D:7}, main.Index{A:8, B:0, C:9, D:47244640266}}
显然,从 Python 生成的文件中读取时,输出是混乱的。
所以我的问题是,如何在 Go 中正确读取 Python 生成的文件(带填充)?
慕妹3242003
料青山看我应如是
相关分类