struct pack读写二进制-Python

       

目录

       

 应用场景说明

 函数说明

写整型数据

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

参考信息

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

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值