浮点数浮点数的十六进制字符串

时间:2017-06-16 10:44:57

标签: python-3.x

我在python 3.6中工作 我从串行通信中收到一个字符串'3F8E353F'。这是一个1.111的浮点数。如何将此字符串转换为浮点数? 谢谢

3 个答案:

答案 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)的可怜的灵魂。