将int列表转换为float

时间:2014-11-14 16:48:13

标签: python floating-point-conversion

我正在尝试将存储为int列表的数字转换为float类型。我通过串行控制台得到了这个号码,想把它重新组装成一个浮子。 我在C中这样做的方式是这样的:

bit_data = ((int16_t)byte_array[0] << 8) | byte_array[1];
result = (float)bit_data;

我在python中尝试使用的是一个更简单的转换:

result = int_list[0]*256.0 + int_list[1]

但是,这并不像C代码那样保留结果的符号。 在python中执行此操作的正确方法是什么?

更新 Python版本是2.7.3。 我的字节数组的长度为2。 在python代码中,byte_array是整数列表。我已将其重命名以避免误解。我不能只使用float()函数,因为它不会保留数字的符号。

4 个答案:

答案 0 :(得分:2)

我不确定我是否真的理解你在做什么,但我认为你从流中获得了4个字节,并且知道它们代表一个float32值。处理它的方式表明了big-endian字节顺序。

Python有struct包(https://docs.python.org/2/library/struct.html)来处理字节流。

import struct

stream = struct.pack(">f", 2/3.)
len(stream) # 4

reconstructed_float = struct.unpack(">f", stream)

答案 1 :(得分:2)

我认为你想要的是struct module

这是一个往返代码段:

import struct
sampleValue = 42.13
somebytes = struct.pack('=f', sampleValue)
print(somebytes)
result = struct.unpack('=f', somebytes)
print(result)

result可能会让您感到惊讶。 unpack返回一个元组。所以要达到你可以做的价值

result[0]

或将结果设置行修改为

result = struct.unpack('=f', some bytes)[0] 

我个人很讨厌,所以请改用以下内容

result , = struct.unpack('=f', some bytes) # tuple unpacking on assignment

您会注意到的第二件事是该值有额外的噪音数字。这是因为python的原生浮点表示是double

(这是python3顺便说一下,根据需要调整使用旧版本的python)

答案 2 :(得分:2)

我对您拥有的数据以及它在Python中的表示方式感到有些困惑。据我所知,你通过串行连接收到了两个无符号字节,现在由两个python int列表表示。此数据表示一个大端16位有符号整数,您要将其提取并转换为浮点数。例如。 [0xFF, 0xFE] - &gt; -2 - &gt; -2.0

import array, struct

two_unsigned_bytes = [255, 254] # represented by ints
byte_array = array.array("B", two_unsigned_bytes) 
# change above to "b" if the ints represent signed bytes ie. in range -128 to 127
signed_16_bit_int, = struct.unpack(">h", byte_array)
float_result = float(signed_16_bit_int)

答案 3 :(得分:1)

好的,所以我认为int_list实际上并不只是一个整数列表。 int被约束为0-255并表示可以构建为有符号整数的字节。然后你想把它变成一个浮点数。诀窍是正确设置第一个字节的符号,然后像你一样进行处理。

float((-(byte_array[0]-127) if byte_array[0]>127 else byte_array[0])*256 + byte_array[1])