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)