为什么 struct.unpack() 没有返回我期望的值?

问题描述 投票:0回答:1

我有一个二进制文件,我已经读取了它的前 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 个变量的元组。

python struct unpack
1个回答
0
投票

请参阅

struct
文档顶部的注释:

注意: 当没有给出前缀字符时,默认为本机模式。它根据构建 Python 解释器的平台和编译器来打包或解包数据。打包给定 C 结构体的结果包括填充字节,这些字节保持所涉及的 C 类型的正确对齐;同样,拆包时也会考虑对齐。相反,当在外部源之间通信数据时,程序员负责定义元素之间的字节顺序和填充。有关详细信息,请参阅字节顺序、大小和对齐方式

因此指定字节顺序并且不使用填充:

>>> import struct
>>> struct.calcsize('HHHL')
12
>>> struct.calcsize('<HHHL')
10
© www.soinside.com 2019 - 2024. All rights reserved.