【后端】struct.pack()

发布于:2025-08-12 ⋅ 阅读:(15) ⋅ 点赞:(0)

struct.pack() 是 Python 标准库 struct 提供的一个函数,用于将Python中的数据类型(如 int、float)打包成二进制格式(bytes,通常用于网络发送、文件写入、底层通信等。


🧠 一句话理解:

struct.pack('格式字符串', 值1, 值2, ...)
就是把多个值打包成一个 bytes 对象,打包方式由“格式字符串”决定。


🧩 常见格式字符对照表:

格式符 意义(类型) 占字节数 是否符号 示例最大值
B unsigned char(无符号 8 位) 1 字节 无符号 255
b signed char(有符号 8 位) 1 字节 有符号 -128~127
H unsigned short(无符号 16 位) 2 字节 无符号 65535
h signed short(有符号 16 位) 2 字节 有符号 -32768~32767
I unsigned int(无符号 32 位) 4 字节 无符号 4294967295
i signed int(有符号 32 位) 4 字节 有符号 -2^31 ~ 2^31-1
Q unsigned long long(无符号 64 位) 8 字节 无符号 2^64-1
q signed long long(有符号 64 位) 8 字节 有符号 -2^63 ~ 2^63-1
f float(32 位) 4 字节 有符号 IEEE-754
d double(64 位) 8 字节 有符号 IEEE-754

📐 字节序(Endian)前缀说明:

前缀符号 含义 举例
> 大端(高字节在前) >I 表示大端 uint32
< 小端(低字节在前) <H 表示小端 uint16
! 网络字节序(大端) !I 相当于 >I
@ 按平台本地字节序和对齐方式 不建议用于协议数据
= 按平台字节序但不对齐 跨平台通信不推荐

✅ 示例讲解:

import struct

# 1. 小端无符号 32 位整数(4 字节)打包
b1 = struct.pack('<I', 12345678)  # 返回 b'\x4e\x61\xbc\x00'

# 2. 大端无符号 64 位整数(8 字节)打包
b2 = struct.pack('>Q', 0x5e5e5e5e5e5e5e5e)  # 帧头

# 3. 多个字段一起打包:大端帧头 + 小端4个uint32
packed = struct.pack('>QIIII', 0x5e5e5e5e5e5e5e5e, 1000, 2000, 30, 40)

🛠️ 解包(对应 struct.unpack()

data = b'\x01\x00\x00\x00'  # 小端 1
value = struct.unpack('<I', data)[0]  # => 1

🔁 常见通信例子

frame = struct.pack('>Q', 0x1234567890abcdef)  # 大端帧头
frame += struct.pack('<I', 1000)  # 小端频点
frame += struct.pack('<I', 2000)  # 小端频点

✅ 总结背口诀:

  • I 就是 4 字节无符号整型(uint32)

  • Q 就是 8 字节无符号整型(uint64)

  • H 是 2 字节无符号整型(uint16)

  • < 是小端,加 > 是大端

  • pack → Python → bytes,unpack → bytes → Python