struct pack return is too long

試著忘記壹切 提交于 2019-11-28 11:22:11
Lucas

pack will add pad bytes so that the second integer is 4 byte aligned. From the documentation:

By default, the result of packing a given C struct includes pad bytes in order to maintain proper alignment for the C types involved; To ... omit implicit pad bytes, use standard size and alignment instead of native size and alignment: see Byte Order, Size, and Alignment for details

That's a consequence of "Data structure padding". It will pad the H (2 bytes + 2 bytes padding) so that it aligns with the I (4 bytes).

However you can experiment with the order if you need to decrease the size. To quote Wikipedia:

It is possible to change the alignment of structures to reduce the memory they require (or to conform to an existing format) by reordering structure members or changing the compiler’s alignment (or “packing”) of structure members.

For example on my computer it works if you just swap the H and I:

import struct
values = (0, 1)
s = struct.Struct('IH')         # swapped H and I
b = s.pack(*values)
print(b)                        # b'\x00\x00\x00\x00\x01\x00'
print(str(len(b)))              # 6
print(struct.calcsize('IH'))    # 6
print(struct.calcsize('HI'))    # 8

The size computation is not directly additive for the contained native types. You should compute the size using struct.calcsize:

In [8]: struct.calcsize('HI')
Out[8]: 8
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!