字节数据打包
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前的数字表示其内容长度。