Python中的结构模块
该模块执行Python值和表示为Python字节对象的 C 结构之间的转换。格式字符串是用于在打包和解包数据时指定预期布局的机制。模块结构在Python 3.x 中可用,在 2.x 中不可用,因此这些代码将在 Python3 解释器上运行。
结构函数
- struct.pack()
Syntax: struct.pack(format, v1, v2, ...)
返回包含根据给定格式打包的值 v1、v2、... 的字符串(格式字符串是用于在打包和解包数据时指定预期布局的机制)。格式后面的值必须按照仅格式,否则会引发 struct.error。
import struct # Format: h is short in C type # Format: l is long in C type # Format 'hhl' stands for 'short short long' var = struct.pack('hhl',1,2,3) print(var) # Format: i is int in C type # Format 'iii' stands for 'int int int' var = struct.pack('iii',1,2,3) print(var)
输出:
b'\x01\x00\x02\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00' b'\x01\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00'
- struct.unpack()
Syntax: struct.unpack(fmt, string)
返回根据给定格式(第一个参数)解包的值 v1、v2、...。此函数返回的值作为元组返回,其大小等于打包期间通过 struct.pack() 传递的值的数量。
import struct # '?' -> _BOOL , 'h' -> short, 'i' -> int and 'l' -> long var = struct.pack('?hil', True, 2, 5, 445) print(var) # struct.unpack() return a tuples # Variables V1, V2, V3,.. are returned as elements of tuple tup = struct.unpack('?hil', var) print(tup) # q -> long long int and f -> float var = struct.pack('qf', 5, 2.3) print(var) tup = struct.unpack('qf', var) print(tup)
输出:
b'\x01\x00\x02\x00\x05\x00\x00\x00\xbd\x01\x00\x00\x00\x00\x00\x00' (True, 2, 5, 445) b'\x05\x00\x00\x00\x00\x00\x00\x0033\x13@' (5, 2.299999952316284)
注意:输出中的“b”代表二进制。
- struct.calcsize()
Syntax: struct.calcsize(fmt) fmt: format
返回与给定格式对应的结构体(以及字符串)的大小。 calcsize() 是一个重要的函数,对于 struct.pack_into() 和 struct.unpack_from() 等函数是必需的,它们也需要偏移值和缓冲区。
import struct var = struct.pack('?hil', True, 2, 5, 445) print(var) # Returns the size of the structure print(struct.calcsize('?hil')) print(struct.calcsize('qf'))
输出:
b'\x01\x00\x02\x00\x05\x00\x00\x00\xbd\x01\x00\x00\x00\x00\x00\x00' 16 12
import struct var = struct.pack('bi', 56, 0x12131415) print(var) print(struct.calcsize('bi')) var = struct.pack('ib', 0x12131415, 56) print(var) print(struct.calcsize('ib'))
输出:
b'8\x00\x00\x00\x15\x14\x13\x12' 8 b'\x15\x14\x13\x128' 5
注意:格式字符的顺序可能会影响大小。
- 异常 struct.error
异常 struct.error 描述了在传递参数时出现的错误,当传递了错误的参数时 struct.error 被引发。from struct import error print(error)
注意:这是一段代码在异常处理之外的任何地方都没有用,它用于在解释显示类时显示“错误”。
- struct.pack_into()
Syntax: struct.pack_into(fmt, buffer, offset, v1, v2, ...) fmt: data type format buffer: writable buffer which starts at offset (optional) v1,v2.. : values
- struct.unpack_from()
Syntax: struct.unpack_from(fmt, buffer[,offset = 0])fmt: data type format buffer: writable buffer which starts at offset (optional)
返回一个元组,类似于 struct.unpack()
import struct # ctypes in imported to create string buffer import ctypes # SIZE of the format is calculated using calcsize() siz = struct.calcsize('hhl') print(siz) # Buffer 'buff' is created buff = ctypes.create_string_buffer(siz) # struct.pack() returns packed data # struct.unpack() returns unpacked data x = struct.pack('hhl', 2, 2, 3) print(x) print(struct.unpack('hhl', x)) # struct.pack_into() packs data into buff, doesn't return any value # struct.unpack_from() unpacks data from buff, returns a tuple of values struct.pack_into('hhl', buff, 0, 2, 2, 3) print(struct.unpack_from('hhl', buff, 0))
输出:
16 b'\x02\x00\x02\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00' (2, 2, 3) (2, 2, 3)