使用struct在python3.6中读取结构化二进制数据

时间:2018-11-10 19:13:15

标签: python struct binary ascii python-3.6

我确实尝试了很多方法来寻找这种疑问,但是也许是因为我从不使用二进制文件,直到我不知道搜索相似内容的关键字可以帮助我什么时候。这就是为什么我在这里问。

所以,我有一个文件:

path = 'myPath/file.pd0'
in_file = open(path, "rb")
read_file = in_file.read()
type(read_file) 

当我尝试检查read_file里面有什么内容时:

b'\x7f\x7f\xcc\x05\x00\x0f$\x00`\x00\xa2\x00$\x02\xe6\x02\xa8\x03\xd0\x032\x04d\x04\x96\x04\xa6\x04\xe0\x04'

read_file的类型为字节。当我尝试使用struct时,因为它是函数,人们建议我得到以下错误:

import struct
struct.unpack('hhl', read_file[0:30])

error: unpack requires a buffer of 16 bytes

无论我解压缩什么fmt,都需要一个n字节的缓冲区。

我尝试读取的文件结构定义如下:

标题 (6个字节+ [2 x数据类型数])

固定领导者数据 (60个字节)

可变领导者数据 (66字节)

关联度 (每个深度单元2个字节+ 4个字节)

有什么主意,我该如何开始使用struct或类似的python命令读取这些字节?

谢谢

1 个答案:

答案 0 :(得分:1)

unpack()期望字节是其第一个参数描述的格式的确切长度。 格式字符串'hhl'描述了16个字节的数据(在您的计算机上-见下文),因此您必须传递16个字节的字符串。 如果您只想解析部分字节,则可以执行以下操作:

fmt = 'hhl'
size = struct.calcsize(fmt)
struct.unpack(fmt, data[:size])

此外,您的格式字符串没有byte order, size and alignment specifier。默认情况下假定为“本机”。这意味着您的代码是与系统有关的,这可能不是解析文件格式所需要的。 您可能需要为文件的不同部分使用不同的对齐方式。