struct.unpack()解包异常主因有三:字节序不匹配(需显式用>、

struct.unpack() 解包时字节序不对导致数值异常
Python struct.unpack() 默认按本机字节序(通常是小端),但 C 程序导出的二进制数据可能固定为大端(如网络协议)或显式指定字节序。若不匹配,int、float 会读成完全错误的值,比如 0x01000000 在小端下被当成了 1,实际应是 16777216。
解决方法:在格式字符串开头显式加字节序符:
-
>表示大端(network byte order),对应 C 的htonl()输出 表示小端,明确声明避免依赖平台-
!等价于>,常用于网络数据 - 省略则用
=(本机序),不推荐用于跨平台解析
例如解析一个大端 uint32_t + float 的结构体:
data = b' ?€ '<br>result = struct.unpack('>If', data) # (1, 1.0)
处理含 padding 的 C struct 时字段对齐错位
C 编译器会对 struct 成员做默认对齐(如 4 字节对齐),而 struct.pack/unpack 默认不模拟这种对齐——它只按格式字符串逐字节解释。结果就是字段偏移错乱,尤其当结构体里混用 char、int、double 时。
正确做法:启用标准 C 对齐规则,用 @ 或 = 格式前缀 + 显式填充字段:
-
@启用 native size + native alignment(最贴近 GCC 默认行为) - 手动插入
x(空字节)或0s占位符补 padding,更可控 - 用
ctypes定义完整 struct 再用cast转换,适合复杂嵌套结构
示例(C 中 struct { char a; int b; }; 实际占 8 字节):
# 正确:@ 模拟对齐<br>struct.unpack('@ci', b' ') # ('\x01', 2)<br># 错误:忽略 padding 直接 'ci' → 读到 ' ' 当作 int,值为 0
字符串字段解包后带多余 或乱码
C 风格字符串是 null-terminated 的 char[],而 struct.unpack('10s', data) 返回的是固定长度 bytes,末尾可能全是

