【后端】struct.pack()
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