目录
应用场景说明
函数说明
写整型数据
写unsigned short型
写浮点数据
写字符串类型
同时写多个数据
参考信息
应用场景说明
用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的组合使用。