字节数据打包
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 | 填充字节 | 无值 | ||
c | char | bytes | 1 | |
b | signed char | integer | 1 | |
B | unsigned char | integer | 1 | |
? | _Bool | bool | 1 | |
h | short | integer | 2 | |
H | unsigned short | integer | 2 | |
i | int | integer | 4 | |
I | unsigned int | integer | 4 | |
l | long | integer | 4 | |
L | unsigned long | integer | 4 | |
q | long long | integer | 8 | |
Q | unsigned long long | integer | 8 | |
n | ssize_t | integer | 只用于原生长度 | |
N | size_t | integer | 只用于原生长度 | |
e | float | float | 2 | 用于半精度浮点 |
f | float | float | 4 | |
d | double | float | 8 | |
s | char[] | bytes | ||
p | char[] | bytes | 表示Pascal字符串 | |
P | void* | integer |
除s
和p
以外的字符,前面添加数字表示重复次数,例如4h
表示hhhh
。s
和p
前的数字表示其内容长度。