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