Skip to main content

Python[Module] struct 数据格式转换

Python对于数据类型的表示,不像其他语言预定义了许多类型,它只定义了六种基本类型:字符串,整数,浮点数,元组,列表,字典。通过这六种数据类型,我们可以完成基本工作,但是与C/C++交互时,就会发现数据类型转换的问题。Struct 模块就是提供了C类型与python类型的转化。

主要的方法:
struct.pack
struct.pack用于将Python的值根据格式符,转换为字符串(因为Python中没有字节(Byte)类型,可以把这里的字符串理解为字节流,或字节数组)。其函数原型为:struct.pack(fmt, v1, v2, …),参数fmt是格式字符串,关于格式字符串的相关信息在下面有所介绍。v1, v2, …表示要转换的python值。

struct.unpack
struct.unpack做的工作刚好与struct.pack相反,用于将字节流转换成python数据类型。它的函数原型为:struct.unpack(fmt, string),该函数返回一个元组。 下面是一个简单的例子:
[python]
str = struct.pack("ii", 20, 400)
a1, a2 = struct.unpack("ii", str)
print ‘a1:’, a1
print ‘a2:’, a2

#—- result:
#a1: 20
#a2: 400

[/python]
pack_into
struct.pack_into(fmt, buffer, offset, v1, v2, …) 和pack 很类似,就是把结果放到一个buffer里
unpack_from
struct.unpack_from(fmt, buffer, offset=0)
pack_info 的反操作,根据format取出对应的数据
[python]
buffer = bytearray(16)
pack_into(‘!LLLL’, buffer, 0, 10, 20, 30, 40)
print(buffer)

unbuffer = unpack_from(‘!LLLL’, buffer, 0)
print(unbuffer)
[/python]

格式
struct_format

例子:
[python]
from struct import *

print(pack(‘hhl’, 1, 2, 3))
print(unpack(‘!LLLL’, b’\x00\x00\xad\xc5\x00\x00\x00\x02\x00\x00\x17\xf2\x00\x00\xad\xb9′))
print(unpack(‘!L’, b’\x77\xab\x77\xab’))
print(pack(‘!L’, 2007725995))
print(unpack(‘!L’, b’w\xabw\xab’))
print(pack(‘!L’, 44485))
print(unpack(‘!L’, b’\x00\x00\xad\xc5′))

str = pack("ii", 20, 1)
print(repr(str))
print(str)

[/python]

Python Struct