将四个字节合并并转换为浮点数

2 投票
1 回答
9346 浏览
提问于 2025-04-18 18:54

我在网上找到了很多关于我问题的讨论,但没有一个完全符合我的需求,或者我在重新利用这些信息时遇到了困难。

我正在使用一个叫做 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,)

撰写回答