我正在玩解开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
这是一个错误,还是我错过了什么?
答案 0 :(得分:3)
请参阅struct
模块文档的顶部:
注意:默认情况下,打包给定C struct 的结果包括填充字节,以便为所涉及的C类型保持正确的对齐;类似地,在拆包时考虑对齐。选择此行为,以便打包结构的字节与相应C结构的内存中的布局完全对应。要处理与平台无关的数据格式或省略隐式填充字节,请使用标准大小和对齐而不是本机大小和对齐:有关详细信息,请参阅Byte Order, Size, and Alignment。
强调我的。你在这里看到了对齐填充的效果。
设置字节顺序或使用=
生成非填充格式:
>>> from struct import calcsize
>>> calcsize('15sH')
18
>>> calcsize('=15sH')
17