目录


 应用场景说明

 函数说明

写整型数据

写unsigned short型

写浮点数据

写字符串类型

同时写多个数据

参考信息


        应用场景说明

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

        函数说明

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

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

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

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

python 获取二进制大小 python 读二进制_数据

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

python 获取二进制大小 python 读二进制_字符串_02

写整型数据


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的组合使用。