Python:将两个连续的2字节寄存器(4字节)转换为IEEE浮点big-endian

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] >>> 我的目标是将这些转换为它们的浮点值,并使过程自动化。目前

我正在通过TCP/IP将仪器连接到笔记本电脑。我一直在使用python包与它对话,并让它返回数字。有两个探针连接到这个仪器上,我相信这是与这两个探针的温度读数相对应的字节

默认情况下,该工具设置为Big-Endian,这些数据应该是32位浮点型的,这意味着代码块中的变量(b)代表两个数字。b代表我将从TCP函数获得的输出

>>> 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)