You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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字节 → 累计14
  • 4x:跳过4字节 → 累计18
  • 2i:2个int,共8字节 → 累计26
  • 2x:跳过2字节 → 累计28
  • h:1个short,占2字节 → 累计30
  • 关键对齐填充:由于下一个字段是i(4字节,要求对齐到4字节边界),当前位置30不是4的倍数,所以自动插入2字节填充 → 累计32
  • 8x:跳过8字节 → 累计40
  • 2i:2个int,共8字节 → 累计48

如果要禁用自动对齐,在格式字符串开头加上=(原生字节序,无对齐),此时46字节的缓冲区就能正常解析:

import struct
struct.unpack('=14x4x2i2xh8x2i', b'\0'*46)
# 输出:(0, 0, 0, 0, 0)

内容的提问来源于stack exchange,提问作者Mark Ransom

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 04:02:43