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

Python struct.unpack要求124字节缓冲区但格式串仅需112字节的原因是什么

核心原因

你计算的是各类型单独占用的字节总和,但Python struct 模块默认使用原生字节序+结构体自动对齐规则,会在不同类型之间插入填充字节,保证高字节长度的类型对齐到对应内存边界,所以实际需要的缓冲区大小会比手动累加的大。

你可以直接运行代码验证:

import struct
fmt = "i f f f f f f f f f i f i f f f f f f B f f B f f B f f B f f"
print(struct.calcsize(fmt)) # 输出结果为124,和报错提示的要求一致

具体差值说明

你的格式串里共有4个B(1字节无符号字符),每个B后面紧跟着的是f(4字节浮点数)。默认对齐规则要求f必须存储在4字节对齐的内存地址上,因此每个B的后面会自动插入3字节的填充位,4个B总共额外增加4*3=12字节的填充,112+12=124,刚好对应报错的缓冲区要求。

解决方法

在格式串的开头添加字节序前缀,即可禁用自动填充:

  • 前缀=:使用原生字节序,关闭对齐填充
  • 前缀<:强制小端字节序,关闭对齐填充
  • 前缀>:强制大端字节序,关闭对齐填充

你需要和客户端约定的字节序匹配,比如假设客户端是小端发送,修改解包代码为:

self.unpacked = struct.unpack("<i f f f f f f f f f i f i f f f f f f B f f B f f B f f B f f", msg)

修改后再用struct.calcsize计算格式串长度就会得到112,和你收到的数据包长度一致,可以正常解包。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.10 06:36:02