安监局网站建设软文写作什么意思
原标题:一文学会Python标准库struct序列化与反序列化
董付国老师面向计算机相关专业的教材《Python程序设计(第2版)》和面向非计算机专业的教材《Python程序设计基础(第2版)》同时被评为 清华大学出版社2019年度畅销图书。
=================
封面图片:《Python程序设计(第2版)》,ISBN:978-7-302-43651-5,董付国,清华大学出版社,第16次印刷
使用Python标准库struct序列化Python整数、实数、字节串时,需要使用struct模块的pack函数把对象按指定的格式进行序列化,然后使用文件对象的write方法将序列化的结果字节串写入以'wb'或'ab'模式打开的二进制文件。读取时需要使用文件对象的read方法从以'rb'模式打开的二进制文件中读取指定数量的字节串,然后再使用struct模块的unpack函数反序列化得到原来对象息。如果需要的话,可以使用calcsize函数计算指定类型序列化时所需要的字节数量。标准库struct中常用的函数及功能下表所示。
表 标准库struct中的常用函数
函数
功能简介
calcsize(format, /)
计算并返回序列化 format格式的数据需要的字节数量,例如struct.calcsize('i')的值为4,表示序列化整数需要4个字节,也就是说整数的序列化有限制,不能序列化任意大的Python整数
pack(format, v1, v2, ...)
使用参数 format指定的格式对v1、v2等若干值进行序列化,返回序列化后的字节串
unpack(format, buffer, /)
使用参数 format指定的格式对参数buffer指定的字节串进行反序列化,返回包含若干值的元组
struct模块支持多种类型的数据序列化,表9-3中函数参数format可取的值如下表所示。这些格式可以组合使用,对多个数据同时序列化,例如struct.pack('ii', 345, 123)表示把两个整数345和123序列化为一个字节串,结果为b'Yx01x00x00{x00x00x00'。
另外,format可以使用第一个字符来指定序列化时使用的字节顺序、长度和对齐方式,不指定时默认值@会根据需要自动进行字节填充和对齐。例如,struct.pack('i?', 3, True)的值为b'x03x00x00x00x01',长度为5个字节,而struct.pack('?i', True, 3)的值为b'x01x00x00x00x03x00x00x00',长度为8个字节。可以设置format第一个字符为或=,这时不会自动进行字节填充和对齐,要注意的是pack函数的format参数和对应的unpack函数的format参数使用的字节顺序和对齐方式要一致。
表 struct支持的格式
格式字符
对应的 C语言类型
对应的 Python类型
使用的字节数量
c
char
长度为 1 的字节串
1
b
signed char
整数
1
B
unsigned char
整数
1
?
_Bool
布尔值 True/False
1
h
short
整数
2
H
unsigned short
整数
2
i
int
整数
4
I
unsigned int
整数
4
l
long
整数
4
L
unsigned long
整数
4
q
long long
整数
8
Q
unsigned long long
整数
8
n
ssize_t
整数
8
N
size_t
整数
8
f
float
浮点数
4
d
double
浮点数
8
s
char[]
字节串
1
p
char[]
字节串
1
P
void *
整数
8
例编写程序,对若干不同的值进行序列化并写入二进制文件,然后读取这个二进制文件中的数据进行还原。
解析:程序中的格式字符串'if?i56si64si64s'对应1个整数、1个实数、1个bool值、1个整数(表示后面紧邻的56个字节中有效字节的数量)、1个字节串(实际长度为56个字节,其中只有前面一部分是有效字节,后面是填充符)、1个整数(表示后面紧邻的64个字节中有效字节的数量)、1个字节串(实际长度为64个字节,其中只有前面一部分是有效字节,后面是填充符)、1个整数(表示后面紧邻的64个字节中有效字节的数量)、1个字节串(实际长度为64个字节,其中只有前面一部分是有效字节,后面是填充符)进行序列化。通过内置函数str可以把任意Python对象转换为字符串然后再使用encode方法转换为字节串最后使用struct进行序列化,在网络编程使用socket传输数据时经常用到struct序列化和反序列化。
教学大纲
责任编辑: