Python二进制数据服务

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(format)

该构造函数返回一个新的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)