我正在尝试将存储为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()函数,因为它不会保留数字的符号。
答案 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])