Python Struct,大小因对齐而变化。
这是我想要解码的十六进制代码。
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