python的pickle模块可以很方便的进行序列化的操作,将一个Python对象序列化为一个字节流,以便将它保存到一个文件、存储到数据库或者通过网络传输它。
但是当我们直接使用pickle的时候,保存的字节流无法被例如C等其他语言读取。所以Python提供了一个struct模块,用来处理Python数据和C/C#等数据之间的转换。
struct模块的内容不多,也不是太难,下面对其中最常用的方法进行介绍:
struct.pack
struct.pack用于将Python的值根据格式符,转换为字符串(因为Python中没有字节(Byte)类型,可以把这里的字符串理解为字节流,或字节数组)。
其函数原型为:struct.pack(fmt, v1, v2, …),参数fmt是格式字符串,关于格式字符串的相关信息在下面有所介绍。v1, v2, …表示要转换的python值。下面的例子将两个整数转换为字符串(字节流):
import struct
a = 20
b = 400
str = struct.pack("ii", a, b) #转换后的str虽然是字符串类型,但相当于其他语言中的字节流(字节数组),可以在网络上传输
print 'length:', len(str)
print str
格式符”i”表示转换为int,’ii’表示有两个int变量。
struct.unpack
struct.unpack做的工作刚好与struct.pack相反,用于将字节流转换成python数据类型。它的函数原型为:struct.unpack(fmt, string),该函数返回一个元组。 下面是一个简单的例子:
str = struct.pack("ii", 20, 400)
a1, a2 = struct.unpack("ii", str)
print 'a1:', a1
print 'a2:', a2
#---- result:
#a1: 20
#a2: 400
struct.calcsize
struct.calcsize用于计算格式字符串所对应的结果的长度,如:struct.calcsize(‘ii’),返回8。因为两个int类型所占用的长度是8个字节。
关于格式字符串
在Python手册中,给出了C语言中常用类型与Python类型对应的格式符:
Format C Type Python type Standard size
x pad byte no value
c char string of length 1 1
b signed char integer 1