gpt4 book ai didi

python - 将 4 个 uint_8 值转换为 python 中的 float

转载 作者:太空宇宙 更新时间:2023-11-04 11:15:24 25 4
gpt4 key购买 nike

我正在开发一个通过蓝牙将传感器数据帧发送到主机的系统。主机运行一个处理传感器数据的 python 程序。传感器数据包含来自开发套件板上 c 代码的 float(32) 值。这些值被分成 4 个字节 (uint_8)。我想将这些值转换回 float32。我尝试了各种解决方案,但似乎都没有用。有任何想法吗?

我试过使用 struct.pack/struct.unpack 函数,但我要么误解了用法,要么有其他错误。输入示例:[22, 132, 0, 0, 0, 0, 199, 230, 254, 255, 255....

def int2bytes(i):
hex_value = '{0:x}'.format(i)
# make length of hex_value a multiple of two
hex_value = '0' * (len(hex_value) % 2) + hex_value
return codecs.decode(hex_value, 'hex_codec')

def convert_from_byte(data):
byte_array = [0]*4
byte_count = 0
float_count = 0
data_size = len(data)
data_float = [] * 247
for i in range(data_size):
byte_array[byte_count] = int2bytes(data[i])
if(byte_count==3):
byte_array = ''.join(byte_array)
data_float[float_count] =struct.unpack('<f', byte_array)
float_count += 1
byte_count = 0
byte_count += 1
return data_float

我希望这些值在 0.005 左右,但它可能相差很大。

最佳答案

我认为您的输入不正确。直观上,[22,132,0,0] 和 [0,0,199,230] 是截然不同的数字,第一个字节的高位字节为零,第二个字节的低位字节为零。

您可以使用以下代码轻松地将 4 个无符号字节转换为 float 。在此示例中,我将使用大端格式的 4 个字节来匹配维基百科中的第一个示例(请参阅 single-precision examples)。所以只需将低位设置为 [0, 0, 0, 1]

import struct
>>>struct.unpack('>f', struct.pack('4B', *[0,0,0,1]))
(1.401298464324817e-45,)

所以打包 4 个字节,然后解包为 big-endian float 。您可以用相同的方式执行小端 float ,只需反转输入和 float 法说明符即可。

>>> struct.unpack('<f', struct.pack('4B', *[1,0,0,0]))
(1.401298464324817e-45,)

当我尝试你的数据时,它与你所期望的完全不同,所以我怀疑你得到的输入是错误的。

data = [22, 132, 0, 0, 0, 0, 199, 230,]
>>> struct.unpack('<f',struct.pack('4B', *data[:4]))
(4.738350627267936e-41,)
>>> struct.unpack('<f',struct.pack('4B', *data[4:8]))
(-4.698754650455297e+23,)

所以一个结果太小了 38 个数量级,另一个太高了 26 个数量级。在任何情况下,一旦弄清楚输入为什么会乱七八糟,就可以使用上述方法将字节转换为 float 。

最后对列表中的所有字节执行相同的过程以创建 float 列表。

[struct.unpack('<f',struct.pack('4B', *data[i:i+4]))[0] for i in range(0, len(data), 4)]

关于python - 将 4 个 uint_8 值转换为 python 中的 float ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57119566/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com