3. struct 包¶
3.1. 基本概念¶
Note
对python基本类型值与用python字符串格式表示的C struct类型间的转化。
多用于存取文件,或是socket数据交换时使用。
它的类型对照表
| 格式 | C 语言类型 | python 类型 | 字节数 |
|---|---|---|---|
| x | 填充字节 | no value | 1 |
| c | char | string of length 1 | 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 | int | 4 |
| I | unsigned int | integer or long | 4 |
| l | long | integer | 4 |
| L | unsigned long | long | 4 |
| q | long long | long | 8 |
| Q | unsigned long long | long | 8 |
| f | float | float | 4 |
| d | double | float | 8 |
| s | char[] | string | 1 |
| p | char[] | string | 1 |
| P | void * | long |
Hint
- 每个格式前面可以有个数字,表示个数
- s与p, s表示一定格式的字符串,但是p表示的是pascal字符串
- P用来转换一个指针,其长度和机器字长相关
对齐方式:
| Character | Byte order | Size | Alignment |
|---|---|---|---|
| @(默认) | 本机 | 本机 | 本机,凑够4个字节 |
| = | 本机 | 标准 | none,按原字节数 |
| < | 小端 | 标准 | none,按原字节数 |
| > | 大端 | 标准 | none,按原字节数 |
| ! | network(大端) | 标准 | none,按原字节数 |
Hint
- 小端:较高的有效字节存放在较高的存储器地址中,较低的有效字节存放在较低的存储器地址,符合计算机处理
- 大断:较低的有效字节存放在较高的存储器地址中,较高的有效字节存放在较低的存储器地址,符合人类正常思维逻辑
3.2. 使用¶
calcsize: 计算格式的字节长度
>>> struct.calcsize('>IH') # I 4个 H 2个 总共6个 6
pack 和 unpack
pack 将python类型转换成C 二进制
unpack 则是反过来,将二进制转换成python类型
>>> struct.pack('<iHs',2,3,'e.w/'.encode()) b'\x02\x00\x00\x00\x03\x00e' >>> struct.pack('<iH3s',22,3,'e.w/'.encode()) # 前面可以跟数字 b'\x16\x00\x00\x00\x03\x00e.w' >>> struct.pack('<2i',22,3) b'\x16\x00\x00\x00\x03\x00\x00\x00' >>> struct.pack('>2i',22,3) # 大端 和小端 的区别 b'\x00\x00\x00\x16\x00\x00\x00\x03' >>> struct.unpack('>2i',b'\x00\x00\x00\x16\x00\x00\x00\x03') #转换成python数据 (22, 3)
pack_into 和 unpack_from