我在python 3.6中工作 我从串行通信中收到一个字符串'3F8E353F'。这是一个1.111的浮点数。如何将此字符串转换为浮点数? 谢谢
答案 0 :(得分:1)
啊,是的。由于这是32位,因此首先将其解压缩到int
:
x='3F8E353F'
struct.unpack('f',struct.pack('i',int(x,16)))
在我的系统上,这给出了:
>>> x='3F8E353F'
>>> struct.unpack('f',struct.pack('i',int(x,16)))
(1.1109999418258667,)
>>>
非常接近预期值。但是,这可以提供倒退的'结果基于' endianness'系统中的字节数。有些系统首先存储它们的字节最低有效字节,其他系有关描述符的格式,请参见this reference page。
答案 1 :(得分:0)
我使用struct.unpack('f',struct.pack('i',int(x,16)))
将十六进制值转换为浮点数,但是对于负值,我的错误率低于错误值
struct.error:参数超出范围
要解决此问题,我使用了以下代码,该代码将十六进制(0xc395aa3d)转换为浮点值(-299.33)。它既适用于正值,也适用于负值。
x = 0xc395aa3d
struct.unpack('f', struct.pack('I', int(x,16) ))
答案 2 :(得分:0)
另一种方法是使用 bytes.fromhex()
import struct
hexstring = '3F8E353F'
struct.unpack('!f', bytes.fromhex(hexstring))[0]
#answer:1.1109999418258667
注意:形式为“!”适用于那些声称自己不记得网络字节顺序是大端还是小端(来自struct docs)的可怜的灵魂。