字节数据打包

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

Python提供了一个struct模块来解决bytes和其他二进制数据类型的转换。struct的pack函数把任意数据类型变成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

除s和p以外的字符,前面添加数字表示重复次数,例如4h表示hhhh。s和p前的数字表示其内容长度。