Python 二进制数据服务
Python 库中 `struct` 模块的规定在执行 C 类型结构体和 Python 字节对象之间的转换方面非常有用。这可以通过模块级函数以及 `struct` 模块中定义的 `Struct` 类及其方法来实现。
转换函数使用格式字符串。格式字符串中使用的字节顺序、大小和对齐方式由格式字符确定,如下表所示
字符 | 字节顺序 | 大小 | 对齐 |
---|---|---|---|
@ | 原生 | 原生 | 原生 |
= | 原生 | 标准 | 无 |
< | 小端序 | 标准 | 无 |
> | 大端序 | 标准 | 无 |
! | 网络字节序(= 大端序) | 标准 | 无 |
下表显示了用于表示 C 类型变量和相应 Python 类型的格式字符。
格式 | C 类型 | Python 类型 |
---|---|---|
x | 填充字节 | 无值 |
c | char | 长度为 1 的字节 |
b/B | 有符号/无符号 char | 整数 |
? | _Bool | bool |
h/H | short/unsigned short | 整数 |
i/I | int/unsigned int | 整数 |
l/L | long/unsigned long | 整数 |
f | float | float |
d | double | float |
s | char[] | bytes |
p | char[] | bytes |
P | void * | 整数 |
`struct` 模块中定义了以下函数
pack()
此函数返回一个字节对象,其中包含根据格式字符串 `format` 打包的值。格式字符必须与格式所需的值匹配。
unpack()
此函数根据格式字符串 `format` 从缓冲区解包。即使结果只包含一项,它也是一个元组。
以下代码演示了这些函数的使用。
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(format)
此构造函数返回一个新的 `Struct` 对象,该对象根据格式字符串 `format` 写入和读取二进制数据。
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)
广告