为何struct.unpack需要额外2字节?格式计算与实际需求不符
struct.unpack 字节数计算错误原因分析
执行以下代码时报错:
struct.unpack('14x4x2i2xh8x2i', b'\0'*46)报错信息:
Traceback (most recent call last): File "<pyshell#88>", line 1, in <module> struct.unpack('14x4x2i2xh8x2i', b'\0'*46) struct.error: unpack requires a buffer of 48 bytes
问题出在Python struct模块默认的字节对齐规则上。默认情况下,struct使用本地字节序(格式符@),会遵循C语言结构体的对齐规范自动插入填充字节,你手动计算时忽略了这部分额外的填充。
我们逐段拆解格式字符串并计算实际占用字节(以32位系统为例,int占4字节,short占2字节):
14x:跳过14字节 → 累计144x:跳过4字节 → 累计182i:2个int,共8字节 → 累计262x:跳过2字节 → 累计28h:1个short,占2字节 → 累计30- 关键对齐填充:由于下一个字段是
i(4字节,要求对齐到4字节边界),当前位置30不是4的倍数,所以自动插入2字节填充 → 累计32 8x:跳过8字节 → 累计402i:2个int,共8字节 → 累计48
如果要禁用自动对齐,在格式字符串开头加上=(原生字节序,无对齐),此时46字节的缓冲区就能正常解析:
import struct struct.unpack('=14x4x2i2xh8x2i', b'\0'*46) # 输出:(0, 0, 0, 0, 0)
内容的提问来源于stack exchange,提问作者Mark Ransom
相关产品推荐
相关产品推荐

