Python:将两个连续的2字节寄存器(4字节)转换为IEEE浮点big-endian
我正在通过TCP/IP将仪器连接到笔记本电脑。我一直在使用python包与它对话,并让它返回数字。有两个探针连接到这个仪器上,我相信这是与这两个探针的温度读数相对应的字节 默认情况下,该工具设置为Big-Endian,这些数据应该是32位浮点型的,这意味着代码块中的变量(b)代表两个数字。b代表我将从TCP函数获得的输出Python:将两个连续的2字节寄存器(4字节)转换为IEEE浮点big-endian,python,hex,byte,Python,Hex,Byte,我正在通过TCP/IP将仪器连接到笔记本电脑。我一直在使用python包与它对话,并让它返回数字。有两个探针连接到这个仪器上,我相信这是与这两个探针的温度读数相对应的字节 默认情况下,该工具设置为Big-Endian,这些数据应该是32位浮点型的,这意味着代码块中的变量(b)代表两个数字。b代表我将从TCP函数获得的输出 >>> b = [16746, 42536, 16777, 65230] >>> 我的目标是将这些转换为它们的浮点值,并使过程自动化。目前
>>> b = [16746, 42536, 16777, 65230]
>>>
我的目标是将这些转换为它们的浮点值,并使过程自动化。目前,我正在通过(hex)函数运行b来检索每个字节的十六进制等效值:
>>> c =[hex(value) for value in b]
>>>
>>> c
>['0x416a', '0xa628', '0x4189', '0xfece']
>>>
。。。然后,我在下面手动创建了data_1
和data_2
,以匹配这些十六进制值,然后使用struct.unpack将它们解包,如我在中找到的:
一些问题:
- 我真的错过了什么吗?我是一名生物学家,通常是
R
程序员,因此Python对我来说相对较新李>
- 我主要在寻找一种从TCP输出(
b
)到struct.unpack的数量输出的简化方法。该项目的最终目标是不断地轮询传感器以获取数据,这些数据将被绘制/显示在屏幕上,并保存到.csv文件中李>
谢谢大家! 下面的函数生成与您找到的相同的数字:
import struct
def bigIntToFloat(bigIntlist):
pair = []
for bigInt in bigIntlist:
pair.append(bytes.fromhex(format(bigInt, '04x')))
if len(pair) == 2:
yield struct.unpack('>f', b''.join(pair))[0]
pair = []
关键部分是格式(bigInt,'04x')
,它将整数转换为十六进制值,而不使用(在本例中)不需要的“0x”,同时确保它是四个字符的零填充,以及bytes.fromhex
,它将整数的输出转换为适合struct.unpack
的bytes对象
至于你是否遗漏了什么,我很难说,但我要说的是,你给出的数字看起来“合理”——也就是说,如果你的顺序错了,我希望这些数字彼此之间会有很大的不同,最简单的方法是使用struct.pack
将这些数字转换回字节字符串,然后像刚才那样解包pack
和unpack
也可以同时使用多个值;唯一的障碍是pack
需要单独的参数而不是列表,因此必须在前面放一个*
来展开列表
>>> struct.unpack('>2f', struct.pack('>4H', *b))
(14.665565490722656, 17.24941635131836)
如果你写的是十六进制(…)
格式是little endian。谢谢你,Nathan!这一点非常有效,除了当format(bigInt,'x')
返回的十六进制值小于4位时,有时会失败。在这种情况下,有必要在将其运行到字节之前添加前面的零。fromhex()
:a=format(bigInt,'x');而len(a)@Umi太棒了!我没有想到零填充问题;仅供参考,您可以使用a=format(bigInt,'04x')
更清晰地解决这个问题。
>>> struct.unpack('>2f', struct.pack('>4H', *b))
(14.665565490722656, 17.24941635131836)