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)

更新于:2019年7月30日

325 次浏览

启动您的职业生涯

完成课程获得认证

开始
广告