struct --- 将字节串解读为打包的二进制数据
面对网络协议,在组包拆包时,python提供了struct模块,可以在python值和C语言的结构体之间相互转换。
格式字符串
格式字符串的第一个字符可用于指示打包数据的字节顺序,大小和对齐方式:
字符 | 字节顺序 | 大小 | 对齐方式 |
---|---|---|---|
@ |
按原字节 | 按原字节 | 按原字节 |
= |
按原字节 | 标准 | 无 |
< |
小端 | 标准 | 无 |
> |
大端 | 标准 | 无 |
! |
网络(=大端) | 标准 | 无 |
格式字符
格式字符具有以下含义;C 和 Python 值之间的按其指定类型的转换应当是相当明显的。 ‘标准大小’列是指当使用标准大小时以字节表示的已打包值大小;也就是当格式字符串以 '<'
, '>'
, '!'
或 '='
之一开头的情况。 当使用本机大小时,已打包值的大小取决于具体的平台。
格式 | C 类型 | Python 类型 | 标准大小 | 备注 |
---|---|---|---|---|
x |
填充字节 | 无 | (7) | |
c |
char | 长度为 1 的字节串 | 1 | |
b |
signed char | 整数 | 1 | (1), (2) |
B |
unsigned char | 整数 | 1 | (2) |
? |
_Bool | bool | 1 | (1) |
h |
short | 整数 | 2 | (2) |
H |
unsigned short | 整数 | 2 | (2) |
i |
int | 整数 | 4 | (2) |
I |
unsigned int | 整数 | 4 | (2) |
l |
long | 整数 | 4 | (2) |
L |
unsigned long | 整数 | 4 | (2) |
q |
long long | 整数 | 8 | (2) |
Q |
unsigned long long | 整数 | 8 | (2) |
n |
ssize_t | 整数 | (3) | |
N |
size_t | 整数 | (3) | |
e |
(6) | float | 2 | (4) |
f |
float | float | 4 | (4) |
d |
double | float | 8 | (4) |
s |
char[] | 字节串 | (9) | |
p |
char[] | 字节串 | (8) | |
P |
void* | 整数 | (5) |
格式字符之前可以带有整数重复计数。 例如,格式字符串 '4h' 的含义与 'hhhh' 完全相同。
格式之间的空白字符会被忽略;但是计数及其格式字符中不可有空白字符。
当使用某一种整数格式 ('b', 'B', 'h', 'H', 'i', 'I', 'l', 'L', 'q', 'Q') 打包值 x 时,如果 x 在该格式的有效范围之外则将引发 struct.error。