将chars中的float转换为float(PYTHON)

时间:2013-04-18 15:48:46

标签: python floating-point byte valueconverter

我在python中有一个程序,我希望在其中接收带有一些值的框架。该值由xbee发送。

Xbee发送一个由union结构分成4个字节的浮点数,如下所示:

typedef union _data{
    float f;
    char s[4];
} myFloat;

所以例如,17.23给了我10,-41,-119,65。所以,我必须在python中恢复所有这些值,在我得到4之后,将它们转换成浮点数。自从我读取每个(serial.read())以得到浮点数后,我该怎么做?

这些值将由python脚本接收,我想再次将它们加入到float中。我在python中读到了关于struct的内容,但我在python中并不是很好,我不明白它是如何工作的。

我使用serial.read逐个读取字节。

有什么想法吗?

1 个答案:

答案 0 :(得分:6)

如果我理解正确,你会得到四个整数[10, -41, -119, 65],并且你想将它们重新组合成原来的浮点数。如果是这样,答案已包含在@ DSM的评论中。将这些位拼凑在一起:

>>> import struct
>>> x = [10, -41, -119, 65]
>>> struct.unpack('<f', struct.pack('4b', *x))[0]
17.229999542236328

请注意,我们这里没有完全 17.23,因为该数字不能完全表示为单精度IEEE 754二进制浮点数。

但这听起来有点颠覆:它应该更容易获得原始字节以获得4个整数。你究竟得到整数值的原因是什么?如果你正在使用pyserial,你不能只用read(4)一次获得4个字节,然后直接使用struct.unpack结果吗?例如,我希望这样的东西可以工作(模拟翻译会话):

>>> import struct
>>> x_bytes = ser.read(4)  # (where ser is your Serial instance)
>>> x = struct.unpack('<f', x_bytes)[0]
>>> x
17.229999542236328