struct --- 打包和解包基本数据类型¶
本模块使用格式字符串来描述数据的布局,在 Python 值与以 Python bytes 对象表示的 C 风格结构体之间进行转换。
支持以下字节序:
字符 |
字节序 |
大小 |
对齐 |
|---|---|---|---|
@ |
本机 |
本机 |
本机 |
< |
小端 |
标准 |
无 |
> |
大端 |
标准 |
无 |
! |
网络(= 大端) |
标准 |
无 |
支持以下数据类型:
格式 |
C 类型 |
Python 类型 |
标准大小 |
|---|---|---|---|
b |
signed char |
整数 |
1 |
B |
unsigned char |
整数 |
1 |
h |
short |
整数 |
2 |
H |
unsigned short |
整数 |
2 |
i |
int |
整数(1) |
4 |
I |
unsigned int |
整数(1) |
4 |
l |
long |
整数(1) |
4 |
L |
unsigned long |
整数(1) |
4 |
q |
long long |
整数(1) |
8 |
Q |
unsigned long long |
整数(1) |
8 |
e |
n/a(半精度浮点数) |
浮点数(2) |
2 |
f |
float |
浮点数(2) |
4 |
d |
double |
浮点数(2) |
8 |
s |
char[] |
bytes |
|
P |
void * |
整数 |
当用于大于 30 位的值时需要 long 支持。
需要浮点数支持。
与 CPython 的区别
格式字符串中不支持空白字符。
示例¶
打包和解包小端值。< 前缀选择小端字节序,并采用标准大小且不进行对齐:
import struct
# Pack an unsigned short (H, 2 bytes) then an unsigned int (I, 4 bytes).
data = struct.pack("<HI", 7, 1000)
# data == b'\x07\x00\xe8\x03\x00\x00'
# Unpack returns a tuple of the values, in order.
struct.unpack("<HI", data)
# (7, 1000)
# calcsize() reports how many bytes the format needs.
struct.calcsize("<HI")
# 6
在指定字节偏移处打包到现有缓冲区并从中解包:
buf = bytearray(8)
# Write a little-endian signed int (i) at offset 2.
struct.pack_into("<i", buf, 2, -12345)
# buf == bytearray(b'\x00\x00\xc7\xcf\xff\xff\x00\x00')
# Read it back from the same offset.
struct.unpack_from("<i", buf, 2)
# (-12345,)