24

在 Python 中,我需要将一堆浮点数转换为十六进制。它需要补零(例如,0x00000010 而不是 0x10)。就像http://gregstoll.dyndns.org/~gregstoll/floattohex/一样。(遗憾的是我不能在我的平台上使用外部库,所以我不能使用该网站上提供的库)

这样做最有效的方法是什么?

4

4 回答 4

49

这在 python 中有点棘手,因为不打算将浮点转换为(十六进制)整数。相反,您试图将浮点值的IEEE 754二进制表示解释为十六进制。

我们将使用内置库中的packand函数。unpackstruct

Afloat是 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 - 表示一串原始字节;不是一串一和零。

于 2014-05-13T06:36:54.630 回答
16

在 Pythonfloat中总是双精度的。

如果您需要以十六进制整数的形式输出答案,则该问题已得到解答:

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 表示“4”。请参阅有关 IEEE 浮点的 Wikipedia 文章

于 2016-08-10T16:56:42.343 回答
6

乔纳森·莱因哈特(Jonathon Reinhart)非常有帮助的回答之后。我需要它来通过 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
于 2018-06-08T11:42:17.897 回答
2

如果您使用的是 micropython(问题中没有说,但我找不到),您可以使用它

import struct
import binascii
def float_to_hex(f):
    return binascii.hexlify(struct.pack('<f', f))
float_to_hex(17.5) # 0x418c0000
于 2018-08-30T08:25:46.600 回答