Python struct.calcsize组合格式计算结果与预期不符的咨询
解决Python struct模块组合类型字节大小不符的问题
这事儿是字节对齐在捣乱!struct模块默认遵循C语言的结构体对齐规则,不是简单把各类型的字节数直接相加。
你单独测h(2字节short)和l(8字节long)的时候都是对的,但把它们放一起时,为了对齐到最大类型的字节边界(这里long是8字节,是对齐单位),模块会在short后面自动填充6个空字节,导致总大小变成2+6+8=16,就出现了你看到的结果。
怎么强制紧凑排列(关闭自动对齐)?
你只需要在格式字符串的开头加上字节顺序/对齐修饰符,就能让struct按照精确的字节数来打包/解析:
=:使用本地字节顺序,但取消自动对齐(紧凑排列)<:小端字节序,无对齐>:大端字节序,无对齐!:网络字节序(大端),无对齐
看实际例子:
import struct # 用=修饰符,紧凑排列,总字节数就是2+8=10 print(struct.calcsize("=hl")) # 输出10 # 用<或>也能达到同样效果,根据你的字节序需求选 print(struct.calcsize("<hl")) # 输出10 print(struct.calcsize(">hl")) # 输出10
额外提示
如果你的场景是要和C语言的结构体严格对齐(比如读取C程序生成的二进制文件),那可以不用加修饰符;但如果是要精确读取原始二进制数据的每一个字节,一定要加上这些修饰符来关闭自动对齐。
打包和解包的时候也记得带上修饰符,确保数据处理符合预期:
# 紧凑打包数据 packed = struct.pack("=hl", 123, 456789) print(len(packed)) # 输出10 # 正确解包 short_val, long_val = struct.unpack("=hl", packed) print(short_val, long_val) # 输出123 456789
内容的提问来源于stack exchange,提问作者Ivin Polo Sony
相关产品推荐
相关产品推荐

