struct.pack 的 fmt 文档

struct.pack 的 fmt 文档

对于十六进制的协议,python 中的编写总是会用到 struct.pack 。各种写法,我根本记不住。例如

struct.pack('>H', checksum)
data = struct.pack('>I', id)

一、字节顺序与对齐(首字符)

格式字符串的第一个字符通常表示字节顺序和对齐方式:

字符说明示例
@默认(本地字节序,无对齐)@I
=本地字节序,标准大小=H
<小端(Little-Endian)<i
>大端(Big-Endian)>f
!网络序(等同于大端)!d

二、数据类型与大小

字符C 类型Python 类型大小(字节)示例
x填充字节1x
cchar长度为1的字节1c
bsigned char整数1b
Bunsigned char整数1B
?_Bool布尔值1?
hshort整数2h
Hunsigned short整数2H
iint整数4i
Iunsigned int整数4I
llong整数4l (32位系统)
Lunsigned long整数4L (32位系统)
qlong long整数8q
Qunsigned long long整数8Q
ffloat浮点数4f
ddouble浮点数8d
schar[]字节串长度由数字前缀指定10s
pPascal字符串字节串长度+1字节(最大255)p
Pvoid*整数平台相关P

三、特殊符号

字符说明示例
0填充字节(等同于 x0x
num数字前缀表示重复次数或长度3I 表示打包3个无符号整型
_平台本地大小和对齐(需 Python 3.3+)_d

四、常用组合示例

  1. 打包一个大端 4 字节无符号整型 + 双精度浮点数: python data = struct.pack('>Id', 0x1234, 3.14)

  2. 打包一个带填充的小端结构体(例如 int + char,4 字节对齐): python data = struct.pack('<ic', 42, b'A') # 自动填充 1 字节

  3. 打包一个固定长度的字符串: python data = struct.pack('10s', b'hello') # 补零到 10 字节

  4. 打包布尔值 + 无符号短整型(网络序): python data = struct.pack('!?H', True, 0xABCD)


五、注意事项

  1. 数值范围验证:

    • 例如 B(0~255)、I(0~0xFFFFFFFF),超出范围会报错。
    • 建议在打包前检查数值范围:

      if not (0 <= value <= 0xFFFF):
      raise ValueError("数值超出范围")
  2. 平台差异:

    • lL 在 32 位系统为 4 字节,64 位系统可能为 8 字节。
    • 使用 iI 确保固定 4 字节。
  3. 字符串处理:

    • s 格式需要明确长度(如 10s)。
    • 若需动态长度字符串,可配合 len() 使用: python s = b'hello' data = struct.pack(f'I{len(s)}s', len(s), s)

  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...