Python之struct-将字节数据解析为打包的二进制数据

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',)

参考文档:

struct — Interpret bytes as packed binary data — Python 3.10.4 documentationicon-default.png?t=M3K6https://docs.python.org/3/library/struct.html?highlight=struct#struct-alignment

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值