python数据结构与算法分析豆瓣,数据结构和算法基础Python语言实现
目录二进制数据结构结构函数和结构类打包和解包字节顺序指示符缓冲区
二进制数据结构
在C/C语言中,struct称为结构。在Python中,struct是一个特殊的库,用来处理字节串和原生Python数据结构类型之间的转换。
本文将详细介绍二进制数据结构struct的用法。
结构库包含一组处理结构值的模块级函数和一个结构类。格式指示符将从字符串格式转换为编译后的表示形式,类似于处理正则表达式的方式。
这种转换会消耗一些资源,因此创建一个Struct实例并只对其调用一次方法通常更有效。
Packaging Struct支持使用格式指示符将数据打包成字符串,还支持从字符串中解包数据。格式指示符由表示数据类型的字符串和可选的数量和字节顺序指示符组成。
接下来,让我们封装一个元组,并将其转换为十六进制字节序列。示例如下:
import struct import binascivalues=(2, lyj 。encode (utf-8 ),3.8)s=struct . struct( i3sf )packed _ data=s . pack(* values) print(原始值:,Values)print(格式指示:,s.format)print(大小:,s.size,字节)print(打包值:,binascii.hexlify(packed_data))运行后效果如下:
这里的格式指示符是“I 3s f”。在前面介绍数组array的时候,我们已经列出了一个表。其中I表示整数或长整数,3s表示3字节字符串(LYJ),f表示浮点数。
Unpack()可以在unpack struct库中使用,以便从打包的表示数据中提取数据。这里直接复制上面打包的值进行测试。例子如下:
import struct import binascipacked _ data=Bina ascii . unhexlify(b 020000006 c 796 a 003337340 )s=struct . struct( i3sf )unpacked _ data=s . unpacked(packed _ data)print( unpacked value)
虽然用unpack()解包基本上会得到相同的值,但是浮点数的值略有不同。
字节顺序指示符默认情况下,该值使用本机C库的字节顺序进行编码。结构的字节顺序指示符如下表所示:
含义@原生顺序=原生标准小端大端!网络序列的示例如下:
import struct import binascivalues=(2, lyj 。encode (utf-8 ),3.8) endianness=[(@ , native order ),(=, native standard ),(, little end ),(, network order ),] for code,Name in endianness:s=struct . struct(code i3sf )packed _ data=s . pack(* values)print( format string:,s.format, for ,Name) print (size:,s.size, bytes) print (packed:,bin ASCII .hexlify(packed _ data))print( unpacked:,s. unpacked (packed _ data))运行后,效果如下:
如果您想要更改要编码的字节顺序,如上面的代码所示,您可以通过简单地更改格式字符串来提供显式的字节顺序指令,从而轻松地覆盖此默认选择。
当强调性能或者当数据传入或传出扩展模块时,缓冲区通常处理二进制打包数据。
为了避免为每个打包结构分配一个新的缓冲区的开销,通常,我们使用pack_into()和unpack_from()方法来支持对预先分配的缓冲区的直接写入。
例子如下:
import struct import binaci iii import ctypes import array values=(2, lyj 。encode (utf-8 ),3.8)s=struct . struct( i3sf )print(原始值:,Values)b=ctypes . create _ string _ buffer(s . size)print(打包前(缓冲区的值):,bin ASCII。Hexlify (b.raw)) s.pack _ into (b,0,* values) print(打包后(缓冲区的binas CII . hexlify(b . raw))print( unpack:,s.unpack _ from (b,0)) a=array.array (b ,b \ 0 * s.size) print(打包前(缓冲区值):,bin 0,*values)print(打包后(缓冲区值):,binas CII . hexlify(a))print( unpack:,s。
创建缓冲区有两种方法。其中大小属性用于指示所需的缓冲区大小。
历史提交的图片或压缩文件
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。