python-struct模块

需要处理二进制数据时使用,例如在socket发送、接受的数据中。因为在网络通信中,数据先被打包成结构体(struct)类型,再被打包成二进制字符串流来进行传输。所以数据需要打包和拆包。struct模块的功能就是在python字符串与c结构体之间进行转化。主要有三个函数。

pack(fmt, v1, v2, …)

作用:按照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

unpack(fmt, string)

作用:按照给定的格式(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)

calcsize(fmt)

作用:计算给定的格式(fmt)占用多少字节的内存。

import struct
size = struct.calcsize('3sfI')
print size
[Output] : 12 # 3*1 + 4 + 4 = 11 按4对齐,即12

format格式转换对照表

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字节顺序

在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’

你可能感兴趣的:(Python)