struct 模块通过格式字符串前缀来指定字节序,无需手动转换字节,只需在格式符前加上对应前缀,模块会自动按指定字节序打包 / 解包数据。
字节序前缀
数据类型及符号对照表
| | | | |
|---|
| 布尔型 | ? | | | |
| 字符型 | c | | | |
| b | | | |
| B | | | |
| 短整型 | h | | | |
| H | | | |
| 整型 | i | | | -2¹⁵ ~ 2¹⁵-1(-2147483648 ~ 2147483647) |
| I | | | |
| 长整型 | l | | | |
| L | | | |
| 长长整型 | q | | | |
| Q | 无符号长长整型(unsigned long long) | | |
| 浮点型 | f | | | |
| d | | | 约 ±1.8×10³⁰⁸(15-17 位有效数字) |
| 指针 / 地址 | P | | | 随系统(32 位系统 4 字节,64 位系统 8 字节) |
| 字符串 | s | | | |
| p | | | |
打包/解包
# 原始数据:十进制 258 → 二进制 00000001 00000010
num = 258
# 1. 小端(<)打包:低字节在前 → 00000010 00000001 → 十六进制 0x02 0x01
packed_little = struct.pack('<H', num)
print(f"小端打包结果: {packed_little.hex()}") # 输出:0201
# 2. 大端(>)打包:高字节在前 → 00000001 00000010 → 十六进制 0x01 0x02
packed_big = struct.pack('>H', num)
print(f"大端打包结果: {packed_big.hex()}") # 输出:0102
# 3. 解包:用对应字节序解包,还原原始数据
unpacked_little = struct.unpack('<H', packed_little)[0]
unpacked_big = struct.unpack('>H', packed_big)[0]
print(f"小端解包结果: {unpacked_little}") # 输出:258
print(f"大端解包结果: {unpacked_big}") # 输出:258
# 4. 跨字节序解包(错误示例,用于对比)
wrong_unpack = struct.unpack('>H', packed_little)[0]
print(f"用大端解小端数据: {wrong_unpack}") # 输出:258 → 0x0201 转十进制是 513(错误)