关于Python标准库struct序列化与反序列化详解。有这一篇文章就够了!

本文的文字及图片来源于网络,仅供学习、交流使用,不具备任何商业用途,版权归原做者全部,若有问题请及时联系咱们以做处理python

如下文章来源于腾讯云 做者:Python小屋屋主编程

( 想要学习Python?Python学习交流群:1039649593,知足你的需求,资料都已经上传群文件流,能够自行下载!还有海量最新2020python学习资料。 )
在这里插入图片描述网络

使用Python标准库struct序列化Python整数、实数、字节串时,须要使用struct模块的pack()函数把对象按指定的格式进行序列化,而后使用文件对象的write()方法将序列化的结果字节串写入以’wb’或’ab’模式打开的二进制文件。读取时须要使用文件对象的read()方法从以’rb’模式打开的二进制文件中读取指定数量的字节串,而后再使用struct模块的unpack()函数反序列化获得原来对象息。若是须要的话,可使用calcsize()函数计算指定类型序列化时所须要的字节数量。标准库struct中经常使用的函数及功能下表所示。socket

表 标准库struct中的经常使用函数
在这里插入图片描述
struct模块支持多种类型的数据序列化,表9-3中函数参数format可取的值以下表所示。这些格式能够组合使用,对多个数据同时序列化,例如struct.pack(‘ii’, 345, 123)表示把两个整数345和123序列化为一个字节串,结果为b’Y\x01\x00\x00{\x00\x00\x00’。函数

另外,format可使用第一个字符来指定序列化时使用的字节顺序、长度和对齐方式,不指定时默认值@会根据须要自动进行字节填充和对齐。例如,struct.pack(‘i?’, 3, True)的值为b’\x03\x00\x00\x00\x01’,长度为5个字节,而struct.pack(’?i’, True, 3)的值为b’\x01\x00\x00\x00\x03\x00\x00\x00’,长度为8个字节。能够设置format第一个字符为<、>或=,这时不会自动进行字节填充和对齐,要注意的是pack()函数的format参数和对应的unpack()函数的format参数使用的字节顺序和对齐方式要一致。学习

表 struct支持的格式
在这里插入图片描述
例 编写程序,对若干不一样的值进行序列化并写入二进制文件,而后读取这个二进制文件中的数据进行还原。code

解析:程序中的格式字符串’if?i56si64si64s’对应1个整数、1个实数、1个bool值、1个整数(表示后面紧邻的56个字节中有效字节的数量)、1个字节串(实际长度为56个字节,其中只有前面一部分是有效字节,后面是填充符)、1个整数(表示后面紧邻的64个字节中有效字节的数量)、1个字节串(实际长度为64个字节,其中只有前面一部分是有效字节,后面是填充符)、1个整数(表示后面紧邻的64个字节中有效字节的数量)、1个字节串(实际长度为64个字节,其中只有前面一部分是有效字节,后面是填充符)进行序列化。经过内置函数str()能够把任意Python对象转换为字符串而后再使用encode()方法转换为字节串最后使用struct进行序列化,在网络编程使用socket传输数据时常常用到struct序列化和反序列化。
在这里插入图片描述
运行结果:
在这里插入图片描述orm