python对bytes字节流的处理 struct模块 快速上手

2020-06-07  本文已影响0人  生活就是爱

最近使用struct模块二进制字节流进行读取操作,网上挺多教程都写的挺好的,不过对新手不是很友好
找到有一份笔记可以快速上手,不过格式不大友好,我自己跑了一遍,过程展示出来,向原作者致敬

使用bin_buf = struct.pack(fmt, buf)将buf为二进制数组bin_buf
使用buf = struct.unpack(fmt, bin_buf)将bin_buf二进制数组反转换回buf

1. 整型数 -> 二进制流

buf1 = 256
bin_buf1 = struct.pack('i', buf1) # 'i'代表'integer'    
ret1 = struct.unpack('i', bin_buf1)
print(bin_buf1, '  <====>  ', ret1)

结果如下:

b'\x00\x01\x00\x00'   <====>   (256,)

2. 浮点数 -> 二进制流

buf2 = 3.1415
bin_buf2 = struct.pack('d', buf2) # 'd'代表'double'    
ret2 = struct.unpack('d', bin_buf2)
print(bin_buf2, '  <====>  ', ret2)

结果如下:

b'o\x12\x83\xc0\xca!\t@'   <====>   (3.1415,)

3. 字符串 -> 二进制流

buf3 = 'Hello World'
bin_buf3 = struct.pack('11s', buf3) # '11s'代表长度为11的'string'字符数组    
ret3 = struct.unpack('11s', bin_buf3)
print(bin_buf3, '  <====>  ', ret3)

结果如下:

b'Hello World'   <====>   (b'Hello World',)

4. 结构体 -> 二进制流

# 假设有一个结构体    
# struct header {    
#   int buf1;    
#   double buf2;    
#   char buf3[11];    
# }    
bin_buf_all = struct.pack('id11s', buf1, buf2, buf3)
ret_all = struct.unpack('id11s', bin_buf_all)
print(bin_buf_all,'  <====>  ', ret_all)

结果如下:

b'\x00\x01\x00\x00\x00\x00\x00\x00o\x12\x83\xc0\xca!\t@Hello World'   <====>   (256, 3.1415, b'Hello World')

参考资料:
Python中对字节流/二进制流的操作:struct模块简易使用教程

上一篇 下一篇

猜你喜欢

热点阅读