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
相关产品推荐
相关产品推荐

