struct 模块用于将python值和C结构数据之间的转换,C结构由Python bytes对象表示。
一些struct的函数及方法支持缓存参数(buffer argument).缓存参数能够提供一个可读的或可读写的buffer。而缓存参数参考了实现Buffer Protocol协议的对象。
模块的函数及异常处理
struct.error - 多个场景都会抛出此类异常,蚕食是字符串类型,用来描述哪里出问题了
struct.pack(format, v1, v2, ...)
format, 字符压缩格式,v1, v2,...被压缩的对象; struct.pack(format, v1,v2,...) 将python数据v1,v2, ... 按照指定格式format,压缩成一个字节(bytes)对象。参数与格式的值需要完全匹配。
struct.pack_info(format, buffer, offset, v1, v2,...)
将v1,v2,....的值按照格式字符打包,并将打包的字节对象数据写到一个可写的缓存区,其中offset是缓存区的起始位置, 且offset 是 一个必传参数
struct.unpack(format, buffer) - 返回的对象是元组类型
假定buffer是通过pack(format) 函数打包的数据,umpack(format, buffer) 根据指定的format 将buffer中的数据拆包。 缓存区的数据字节大小必须和format要求的大小一致。
struct.unpack_from(format, /, buffer, offset = 0)
根据format string的格式,将偏移量从offset 开启的缓存内容解压,并返回一个元组对象。注意:从offset开始,缓存区字节的大小至少等于format 格式所表示的字节大小。
struct.iter_unpack(format, buffer) - 该函数返回一个迭代器,该迭代器可以从buffer中读取与format对应的bytes大小相等的内容。
根据format string的格式,迭代的将缓存内容解压,
struct.calcsize(format) - 返回struct的format字符串表示的bytes的大小,
格式字符串 Format Strings
格式字符串用来指定打包和解包数据的布局机制,
字节顺序,大小与对齐机制
默认情况下,C类型由机器的原始格式和顺序表示,并通过跳过一些pad类型来实现合理的对齐。
或者,格式串的第一个字符用来表示字节的顺序,大小和打包数据的对齐方式,如下表:
格式字符串
C结构与Python数据之间的转化应该明确指定数据的类型。当格式串以‘'<’,'>','!', '=' 开头时,表示被打包数据类型的字节的标准大小为依据, 当使用原始大小时,打包的数据是平台独立的。(即不容机器上的数据个字节大小是相同的)
如下图: format 列是不同数据类型的格式串,standard size 是该格式代表的字节数的大小
格式字符前面可以有整数数字,表示重复整数次。例如,格式串 ‘4h’ 意思是‘’hhhh‘’。
对于格式字符‘’s’ 来说,前面的整数表示字节的长度,并不表示重复的次数, 例如‘10s’表示一个10个字节的字符串,而‘10c’ 表示10个字符。重复次数默认是1.。 打包时,字符串可能会被截断(truncate)或用null字节补齐(padding),以保证符合格式串。
字符中间的空格会被忽略掉,但是整数和格式串之间不能有空格。
代码示例:
b = pack('hhl', 1, 2, 3)
print(b) # 输出二进制:b'\x01\x00\x02\x00\x03\x00\x00\x00'
n = unpack('hhl', b'\x01\x00\x02\x00\x03\x00\x00\x00')
print(n) # (1, 2, 3)
print(calcsize('hhl')) # 8个字节
# b'name'
s = pack('4s', b'name')
print(s)
# b'name'
print(pack('4s', 'name'.encode('utf-8')))
print(unpack('4s', b'name')) # (b'name',)
参考文档: