结构中的奇怪格式长度

时间:2013-12-15 09:56:59

标签: python struct

我正在玩解开jpeg图像,我偶然发现了一个非常有趣的行为。

H格式似乎是3个字节长。我设法隔离了这个格式字符串:

print(calcsize('15s2s')) #prints 17
print(calcsize('15sH')) #prints 18

文档说H将2个字节解包为整数。

奇怪的是,当我将其更改为此时,他们都返回16:

print(calcsize('14s2s')) #prints 16
print(calcsize('14sH')) #prints 16

这是一个错误,还是我错过了什么?

1 个答案:

答案 0 :(得分:3)

请参阅struct模块文档的顶部:

  

注意:默认情况下,打包给定C struct 的结果包括填充字节,以便为所涉及的C类型保持正确的对齐;类似地,在拆包时考虑对齐。选择此行为,以便打包结构的字节与相应C结构的内存中的布局完全对应。要处理与平台无关的数据格式或省略隐式填充字节,请使用标准大小和对齐而不是本机大小和对齐:有关详细信息,请参阅Byte Order, Size, and Alignment

强调我的。你在这里看到了对齐填充的效果。

设置字节顺序或使用=生成非填充格式:

>>> from struct import calcsize
>>> calcsize('15sH')
18
>>> calcsize('=15sH')
17