Python Struct,大小因对齐而变化。

2 投票
2 回答
3970 浏览
提问于 2025-04-16 06:38

这是我想要解码的十六进制代码。
b'ABCDFGHa\x00a\x00a\x00a\x00a\x00\x00\x00\x00\x00\x00\x01'(这个内容本身并不需要有意义)

labels = unpack('BBBBBBBHHHHH5sB', msg)
struct.error: unpack requires a bytes argument of length 24

根据我的计算,这两个的长度都是23,既包括我在解码函数中的格式,也包括这些十六进制值的长度。我不太明白。

提前谢谢你们!

2 个回答

3

我觉得 H 是在你的 7 个 B 后面强制要求使用 2 字节对齐。

哦,原来对齐的信息在 http://docs.python.org/library/struct.html 的顶部,而不是在 格式字符的定义 那里。

5

大多数处理器在数据位于自然边界时访问数据会更快。这里的自然边界是指:大小为2的数据应该放在偶数地址上,大小为4的数据应该放在可以被4整除的地址上,依此类推。

struct 默认会保持这种对齐方式。因为你的结构一开始有7个'B',所以会添加一个填充字节,以便将下一个'H'对齐到偶数地址上。为了在Python中避免这种情况,可以在你的字符串前面加上'='。

示例:

>>> import struct
>>> struct.calcsize('BBB')
3
>>> struct.calcsize('BBBH')
6
>>> struct.calcsize('=BBBH')
5

撰写回答