在Python中,我需要将一堆浮点数转换为十六进制。它需要填零(例如,0x00000010而不是0x10)。就像http://gregstoll.dyndns.org/~gregstoll/floattohex/一样。 (遗憾的是我不能在我的平台上使用外部库,因此我不能使用该网站上提供的库)
最有效的方法是什么?
答案 0 :(得分:32)
这在python中有点棘手,因为我们不想将浮点值转换为(十六进制)整数。相反,您尝试将解释浮点值的IEEE 754二进制表示为十六进制。
我们将使用内置struct
库中的pack
和unpack
函数。
float
是32位。我们首先将pack
转换为二进制 1 字符串,然后unpack
将其作为int
。
def float_to_hex(f):
return hex(struct.unpack('<I', struct.pack('<f', f))[0])
float_to_hex(17.5) # Output: '0x418c0000'
我们可以为double
做同样的事情,因为它知道它是64位:
def double_to_hex(f):
return hex(struct.unpack('<Q', struct.pack('<d', f))[0])
double_to_hex(17.5) # Output: '0x4031800000000000L'
1 - 表示一串原始字节; 不一串零和零。
答案 1 :(得分:14)
在Python float
中始终是双精度。
如果您要求以十六进制整数形式输出答案,则问题已经回答:
import struct
# define double_to_hex as in the other answer
double_to_hex(17.5) # Output: '0x4031800000000000'
double_to_hex(-17.5) # Output: '0xc031800000000000'
但是您可以考虑使用内置函数:
(17.5).hex() # Output: '0x1.1800000000000p+4'
(-17.5).hex() # Output: '-0x1.1800000000000p+4'
# 0x1.18p+4 == (1 + 1./0x10 + 8./0x100) * 2**4 == 1.09375 * 16 == 17.5
这是与以前相同的答案,只是采用更加结构化和人类可读的格式。
低52位是尾数。高12位由符号位和11位指数组成;指数偏差为1023 == 0x3FF,因此0x403表示&#39; 4&#39;。请参阅Wikipedia article on IEEE floating point。
答案 2 :(得分:2)
进一步Jonathon Reinhart's非常有帮助answer。我需要这个通过UDP发送浮点数作为字节
import struct
# define double_to_hex (or float_to_hex)
def double_to_hex(f):
return hex(struct.unpack('<Q', struct.pack('<d', f))[0])
# On the UDP transmission side
doubleAsHex = double_to_hex(17.5)
doubleAsBytes = bytearray.fromhex(doubleAsHex.lstrip('0x').rstrip('L'))
# On the UDP receiving side
doubleFromBytes = struct.unpack('>d', doubleAsBytes)[0] # or '>f' for float_to_hex
答案 3 :(得分:0)
如果您使用的是micropython(问题中没有提到,但是我找不到问题),您可以使用此
import binascii
def float_to_hex(f):
binascii.hexlify(struct.pack('<f', f))
float_to_hex(17.5) #Answer: 0x418c0000