将四个字节合并并转换为浮点数
我在网上找到了很多关于我问题的讨论,但没有一个完全符合我的需求,或者我在重新利用这些信息时遇到了困难。
我正在使用一个叫做 smbus.read_byte() 的函数。根据文档,它会返回一个长整型数字。如果我打印它返回的结果,我得到的数字范围是 0 到 255。
我想做的是读取四次,然后把这些信息结合起来生成一个浮点数。所以如果我得到的四个数字是 65、203、96 和 66,它们应该能组合成 25.422。
很多人建议使用 struct 这个包,但我对如何把这些结果合并成一个数字,然后再转换成浮点数有点困惑。
1 个回答
7
>>> data = [65, 203, 96, 66]
>>> b = ''.join(chr(i) for i in data)
>>> import struct
>>> struct.unpack('>f', b)
(25.422000885009766,)
b = struct.pack('4B', *data)
简单来说,join
这一行代码是把每个整数值转换成一个字符字节,然后把这些字节连接成一个字符串,这正是struct.unpack
所需要的输入。测试显示你的字节是大端序的,所以在格式中需要加上>
来进行unpack
。
在Python 3中,字符字符串和字节字符串是有区别的,所以上面提到的join
方法是行不通的。你可以用struct
来代替join
,把这些值组合成一个字节字符串,这在Python 2和3中都可以使用:
而且现在所有版本的Python 2都已经不再支持了,也许你不再关心向后兼容性。在Python 3中,你可以直接把一个列表转换成bytes
,不需要先转换成chr
或者使用struct
模块。
>>> data = [65, 203, 96, 66]
>>> b = bytes(data)
>>> import struct
>>> struct.unpack('>f', b)
(25.422000885009766,)