字节数据打包

Python中没有专门处理字节的数据类型,但由于字节数组可以由二进制字符串表示。而在C语言中,可以很方便的使用structunion来处理字节,以及字节和int,float的转换。

Python提供了一个struct模块来解决bytes和其他二进制数据类型的转换。structpack函数把任意数据类型变成bytes。pack()方法接收两种参数,第一个参数是处理指令,后面是要打包的数据,数据的个数和顺序要与处理指令一致。例如:

import struct
struct.pack('>I', 1024000)

pack()功能相反的方法是unpack(),它接收两个参数,第一个参数依旧是处理指令,第二个参数是要处理的bytes。

处理指令由两部分组成,第一部分是字节序、长度以及对齐标记。默认情况下,C类型会使用机器的原生格式和字节序表示,但是在不同设备之间传递可能就需要变更这些配置。第一部分的控制标记如下:

字符字节序长度对齐
@原生原生原生
=原生标准
>小端序标准
<大端序标准
!网络序标准

剩下的控制字符可以根据编解码内容顺序,选择以下内容。

字符C类型Python类型长度备注
x填充字节无值
ccharbytes1
bsigned charinteger1
Bunsigned charinteger1
?_Boolbool1
hshortinteger2
Hunsigned shortinteger2
iintinteger4
Iunsigned intinteger4
llonginteger4
Lunsigned longinteger4
qlong longinteger8
Qunsigned long longinteger8
nssize_tinteger只用于原生长度
Nsize_tinteger只用于原生长度
efloatfloat2用于半精度浮点
ffloatfloat4
ddoublefloat8
schar[]bytes
pchar[]bytes表示Pascal字符串
Pvoid*integer

sp以外的字符,前面添加数字表示重复次数,例如4h表示hhhhsp前的数字表示其内容长度。