我有一个二进制文件,我已经读取了它的前 50 个字节。
data = ftw.read(50)
print(f" Read {len(data)} bytes: {data}")
temp_tuple = struct.unpack("HHHL", data[0:10])
当我阅读文档时(此处:https://docs.python.org/3/library/struct.html#struct.unpack),似乎“H”将指定2个字节而“L”匹配至 4 字节。因此,3 个“H”总共转换为 6 个字节,1 个“L”添加另外 4 个字节,总共 10 个字节。所以,我不明白为什么会收到以下错误消息:
temp_tuple = struct.unpack("HHHL", data[0:10])
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
struct.error: unpack requires a buffer of 12 bytes
最后一个值“L”应该是一个整数。
为什么我需要 12 个字节?文档中有哪些我不明白的地方?
我期待这种转换能够发挥作用,然后我会得到一个包含 4 个变量的元组。
struct
文档顶部的注释:
注意: 当没有给出前缀字符时,默认为本机模式。它根据构建 Python 解释器的平台和编译器来打包或解包数据。打包给定 C 结构体的结果包括填充字节,这些字节保持所涉及的 C 类型的正确对齐;同样,拆包时也会考虑对齐。相反,当在外部源之间通信数据时,程序员负责定义元素之间的字节顺序和填充。有关详细信息,请参阅字节顺序、大小和对齐方式。
因此指定字节顺序并且不使用填充:
>>> import struct
>>> struct.calcsize('HHHL')
12
>>> struct.calcsize('<HHHL')
10