最近使用struct模块二进制字节流进行读取操作,网上挺多教程都写的挺好的,不过对新手不是很友好
找到有一份笔记可以快速上手,不过格式不大友好,我自己跑了一遍,过程展示出来,向原作者致敬
使用bin_buf = struct.pack(fmt, buf)将buf为二进制数组bin_buf
使用buf = struct.unpack(fmt, bin_buf)将bin_buf二进制数组反转换回buf
1. 整型数 -> 二进制流
1 2 3 4 | buf1 = 256 bin_buf1 = struct.pack('i', buf1) # 'i'代表'integer' ret1 = struct.unpack('i', bin_buf1) print(bin_buf1, ' <====> ', ret1) |
结果如下:
1 | b'\x00\x01\x00\x00' <====> (256,) |
2. 浮点数 -> 二进制流
1 2 3 4 | buf2 = 3.1415 bin_buf2 = struct.pack('d', buf2) # 'd'代表'double' ret2 = struct.unpack('d', bin_buf2) print(bin_buf2, ' <====> ', ret2) |
结果如下:
1 | b'o\x12\x83\xc0\xca!\t@' <====> (3.1415,) |
3. 字符串 -> 二进制流
1 2 3 4 | buf3 = 'Hello World' bin_buf3 = struct.pack('11s', buf3) # '11s'代表长度为11的'string'字符数组 ret3 = struct.unpack('11s', bin_buf3) print(bin_buf3, ' <====> ', ret3) |
结果如下:
1 | b'Hello World' <====> (b'Hello World',) |
4. 结构体 -> 二进制流
1 2 3 4 5 6 7 8 9 | # 假设有一个结构体 # 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) |
结果如下:
1 | b'\x00\x01\x00\x00\x00\x00\x00\x00o\x12\x83\xc0\xca!\t@Hello World' <====> (256, 3.1415, b'Hello World') |
参考资料:
Python中对字节流/二进制流的操作:struct模块简易使用教程