3

如何在 python 中将浮点数转换为 base-16 数字,每个 32 位 FLP 数字 8 个十六进制数字?

例如:input = 1.2717441261e+20 output wanted : 3403244E

4

5 回答 5

9

如果你想要 IEEE-754 表示的字节值,struct模块可以这样做:

>>> import struct
>>> f = 1.2717441261e+20
>>> struct.pack('f', f)
'\xc9\x9c\xdc`'

这是字节的字符串版本,然后可以转换为十六进制值的字符串表示形式:

>>> struct.pack('f', f).encode('hex')
'c99cdc60'

而且,如果您希望它为十六进制整数,请将其解析为:

>>> s = struct.pack('f', f).encode('hex')
>>> int(s, 16)
3382500448

要将整数显示为十六进制:

>>> hex(int(s, 16))
'0xc99cdc60'

请注意,这与您问题中的十六进制值不匹配 - 如果您的值是您想要的正确值,请更新问题以说明它是如何得出的。

于 2013-10-16T22:41:46.530 回答
3

有几种可能的方法可以做到这一点,但没有一种方法会导致您想要的结果。

  • 您可以将此浮点值编码为其 IEEE 二进制表示。这确实导致了一个 32 位数(如果你用单精度来做)。但它会导致不同的结果,无论我认为是哪种字节序:

    import struct
    struct.pack("<f", 1.2717441261e+20).encode("hex")
    # -> 'c99cdc60'
    struct.pack(">f", 1.2717441261e+20).encode("hex")
    # -> '60dc9cc9'
    
    struct.unpack("<f", "3403244E".decode("hex"))
    # -> (687918336.0,)
    struct.unpack(">f", "3403244E".decode("hex"))
    # -> (1.2213533295835077e-07,)
    
  • 由于另一个不适合结果,我将采用其他答案并将它们包括在此处:

    float.hex(1.2717441261e+20)
    # -> '0x1.b939919e12808p+66'
    

    也没有任何关系3403244E,所以也许你想澄清你的意思。

当然还有其他方法可以进行这种对话,但除非你指定你想要哪种方法,否则没有人可以帮助你。

于 2013-10-16T22:38:30.050 回答
1

您的预期输出有问题:

import struct
input = 1.2717441261e+20
buf = struct.pack(">f", input)
print ''.join("%x" % ord(c) for c in struct.unpack(">4c", buf) )

输出 :

60dc9cc9
于 2013-10-16T22:41:28.907 回答
0

试试float.hex(input)。这应该将一个数字转换为表示以 16 为基数的数字的字符串,并与浮点数一起使用,不像hex(). 然而,该字符串将以开头0x,并且在小数点后包含 13 位数字,所以我无法帮助您处理 8 位数字部分。

来源:http ://docs.python.org/2/library/stdtypes.html#float.hex

于 2013-10-16T22:24:35.370 回答
0

试试float.hex(input)是否input已经是一个浮点数。

于 2013-10-16T22:28:36.487 回答