需要处理二进制数据时使用,例如在socket发送、接受的数据中。因为在网络通信中,数据先被打包成结构体(struct)类型,再被打包成二进制字符串流来进行传输。所以数据需要打包和拆包。struct模块的功能就是在python字符串与c结构体之间进行转化。主要有三个函数。
作用:按照fmt提供的格式(即v1,v2等python数据类型),将v1,v2…等数据封装成二进制字符串(相当与c中的结构体的字节流)。例如:
import struct
import binascii
a = ('abc', 1.2, 7)
#packed = struct.pack('3sfI', a[0], a[1], a[2])
packed = struct.pack('3sfI', *a)
print type(packed)
print binascii.hexlify(packed)
其中binascii
用来输出结果。fmt的结构后面讲到。最后的结果为:
<type 'str'>
61626300010000000000e040
作用:按照给定的格式(fmt)解析二进制字节流string,返回解析出来的tuple。
import struct
import binascii
a = ('abc', 1.2, 7)
packed = struct.pack('3sfI', *a)
unpacked = struct.unpack('3sfI', packed)
print type(unpacked)
print unpacked
输出结果:
<type 'tuple'>
('abc', 1.2000000476837158, 7)
作用:计算给定的格式(fmt)占用多少字节的内存。
import struct
size = struct.calcsize('3sfI')
print size
[Output] : 12 # 3*1 + 4 + 4 = 11 按4对齐,即12
Format | C Type | Python Type | 字节数 |
---|---|---|---|
x | pad byte | 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 | integer | 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 |
1.每个格式前可以有一个数字,表示个数
2.s格式表示一定长度的字符串,4s表示长度为4的字符串,但是p表示的是pascal字符串
3.P用来转换一个指针,其长度和机器字长相关
在format字符串前面加上特定的符号即可以表示不同的字节顺序存储方式。
Character | Byte order | Size and alignment |
---|---|---|
@ | native order | native 凑够4个字节 |
= | native standard | standard 按原字节数 |
< | little-endian | standard 按原字节数 |
> | big-endian | standard 按原字节数 |
! | network (= big-endian) | standard 按原字节数 |
使用方法是放在fmt的第一个位置,就像’@5s6sif’