Python库中struct模块的设置对于执行C型结构和Python字节对象之间的转换很有用。这可以通过模块级别的函数以及struct模块中定义的Struct类及其方法来实现。
转换函数使用格式字符串。格式字符串中使用的字节顺序,大小和对齐方式取决于下表中的格式化字符
| 字符 | 字节顺序 | 大小 | 对齐 | 
|---|---|---|---|
| @ | native | native | native | 
| = | native | standard | none | 
| < | little-endian | standard | none | 
| > | big-endian | standard | none | 
| ! | network (= big-endian) | standard | none | 
下表显示了用于表示C类型变量和相应的Python类型的格式字符。
| 格式 | C类型 | Python类型 | 
|---|---|---|
| x | pad byte | no value | 
| c | char | bytes of length 1 | 
| b/B | signed/unsigned char | integer | 
| ? | _Bool | bool | 
| h/H | short/unsigned short | integer | 
| i/I | int/unsigned int | integer | 
| l/L | long/unsigned long | integer | 
| f | float | float | 
| d | double | float | 
| s | char[] | bytes | 
| p | char[] | bytes | 
| P | void * | integer | 
以下功能在struct模块中定义
包()
此函数返回一个字节对象,其中包含根据格式字符串格式打包的值。格式字符必须与格式要求的值匹配。
解压()
此函数根据格式字符串格式从缓冲区解压缩。结果是一个元组,即使它只包含一个项目。
以下代码演示了这些功能的用法。
import struct
student=(1, b'Rahul', 65.75)
packed=struct.pack('I 5s f', *student)
print ('packed data:',packed)
unpacked=struct.unpack('I 5s f', packed)
print ('unpacked data:',unpacked)输出结果
packed data: b'\x01\x00\x00\x00Rahul\x00\x00\x00\x00\x80\x83B' unpacked data: (1, b'Rahul', 65.75)
也可以使用Struct类中的方法来完成打包。一次创建一个Struct对象并调用其方法比使用相同格式的struct函数更有效,因为格式字符串只需要编译一次。
该构造函数返回一个新的Struct对象,该对象根据格式字符串格式写入和读取二进制数据。
pack()
此方法与pack()使用编译格式的函数相同。
unpack()
此方法与unpack()使用编译格式的函数相同。
以下示例显示了如何使用Struct类打包和解包Python数据。
s = struct.Struct('I 5s f')
packed=s.pack(*student)
print (packed)
unpacked = s.unpack(packed)
print (unpacked)打包的数据可以直接解析为命名的元组对象。
from collections import namedtuple
newstudent = namedtuple('newstudent','No Name Marks')
s1 = newstudent._make(struct.unpack('I 5s f', packed))
print (s1)输出结果
newstudent(No=1, Name=b'Rahul', Marks=65.75)