最近使用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')
网友评论