struct.pack格式字符串需严格匹配:字节序前缀(、=)+类型字符(如I/i、H/h、16s),字符串须encode()为bytes,参数仅支持位置传递且数量类型必须一致。

struct.pack 是最直接的打包方式,但必须严格匹配格式字符串与参数类型,否则会报 struct.error。
格式字符串怎么写才不翻车
格式字符串不是随便拼的,它由字节序前缀(可选)+ 类型字符组成。常见错误是忽略默认字节序或混用平台相关类型。
表示小端,>表示大端,=使用本机字节序但固定对齐(推荐显式指定)-
I是无符号 4 字节整数,i是有符号;H是无符号 2 字节,h是有符号——大小写敏感 -
s后必须跟长度,比如16s表示 16 字节字节数组,不足时自动补\x00,超出则截断 - 字符串要先用
.encode()转成bytes,不能直接传str
打包时传参顺序和数量必须严丝合缝
struct.pack 不接受关键字参数,只认位置参数,且个数、类型必须和格式字符串完全对应。
- 格式串
"表示:小端无符号 int + 20 字节 bytes + 有符号 short → 必须传三个参数 - 如果传了
struct.pack(",第 2 个参数长度不够 20 字节, struct会自动补零;但如果传了b"hello world!" * 3(超长),会直接抛struct.error: pack requires exactly 20 bytes for format '20s' - 浮点数用
f(4 字节)或d(8 字节),注意 Pythonfloat默认是 double,传f时得确保值在 float32 范围内,否则精度丢失不报错
打包后数据怎么验证是否正确
别靠猜,用 struct.calcsize 和十六进制输出交叉验证。
- 先算预期长度:
struct.calcsize("返回 26(4 + 20 + 2) - 再打包并检查:
data = struct.pack(",然后 data.hex()输出"7856341274657374000000000000000000000000cdab"—— 小端所以0x12345678变成78563412,0xabcd变成cdab,中间 20 字节里b"test"占前 4 位,后面全是00 - 如果实际长度不对,或者 hex 结果和预期字节排列不一致,说明格式串写错了或参数类型没对齐
最容易被忽略的是字节序和字符串长度控制——尤其当结构体要和其他语言(如 C)对接时,一个 漏写或 20s 写成 20c 就会导致整个协议解析失败,而且问题很难定位。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











