0
点赞
收藏
分享

微信扫一扫

struct pack读写二进制-Python

爱情锦囊 2022-03-19 阅读 90
python

用Python写二进制数时,可能需要把一些整型,浮点型,字符串,甚至结构体等写成二进制文件,然后别人再解析出来,只要知道对应的结构体排布和大小,就能够正确解析出来,一些标准里往往会用到这个。

Python中的struct.pack和struct.unpack就可以用来做这个事情。

pack(fmt, v1, v2, ...) 按照给定的格式(fmt),把数据封装成字符串

unpack(fmt, string) 按照给定的格式(fmt)解析字节流string,返回解析出来的tuple

关键点是fmt,有如下规定:

当然,在处理二进制时,往往还涉及到了大小端问题,有如下规定:

 

写整型数据:

a = 666
t1 = struct.pack('=i', a)   # 系统默认模式,小端
t2 = struct.pack('<i', a)   # 小端模式
t3 = struct.pack('>i', a)   # 大端模式
t4 = struct.pack('!i', a)   # network 大端模式
print(t1, t2, t3, t4)

输出结果为:

b'\x9a\x02\x00\x00' b'\x9a\x02\x00\x00' b'\x00\x00\x02\x9a' b'\x00\x00\x02\x9a'

我的系统默认是小端,network默认是大端

写unsigned short型:

t5 = struct.pack('<H', a)  # unsigned short 2 bytes
t6 = struct.unpack('H', t5)
print(t5, t6)

输出结果为:

b'\x9a\x02' (666,)

unsigned short占两个字节,反向解析出来的也是666

写浮点数据:

ff = 12.34
t7 = struct.pack('<f', ff)  # 4 bytes
t8 = struct.unpack('<f', t7)
print(t7, t8)

输出结果为:

b'\xa4pEA' (12.34000015258789,)

这个是占4个字节(print后显示的字符串,不是16进制,所以看不出来是4个字节,pEA应该是对应的ascii码)。

如果是浮点的数据,用了整型的格式,将报错,类型必须匹配,比如:

# t9 = struct.pack('<i', ff)  # 4 bytes
# t10 = struct.unpack('<i', t9)
# print(t9, t10)

将会报错。

写字符串类型:

aa = b'hello'
t11 = struct.pack('>5s', aa)
t12 = struct.unpack('>5s', t11)
print(t11, t12)

输出结果为:

b'hello' (b'hello',)

其中的5表示字符串的长度,这里需要特别注意,aa='hello‘会报错,必须加个b才行。

同时写多个数据:

只要按对应的格式进行组合即可

t13 = struct.pack('>Hf5s', a, ff, aa)
ar, ffr, aar = struct.unpack('>Hf5s', t13)
t14 = struct.unpack('>Hf5s', t13)
print(t13, t14)
print(ar, ffr, aar)

输出的结果为:

b'\x02\x9aAEp\xa4hello' (666, 12.34000015258789, b'hello')
666 12.34000015258789 b'hello'

完全能够解析出来。

当然,这里只是列出几个比较简单的用法,还有复杂的用法,比如直接写结构体,或者C语言发送的结构体信息,Python进行接收等等,可以多进行尝试,重点还是fmt的组合使用。

参考信息

Python使用struct处理二进制 - JK00 - 博客园

 

举报

相关推荐

0 条评论