将IEEE 754 64位转换为十进制

时间:2018-10-01 14:37:14

标签: python

我有一个要存储为字符串的64位IEEE-754十六进制值列表,我想将其转换为python float

['40D3970060AA64C3', ...]

我已经尝试使用binascii.unhexlify and struct.unpack`来转换每个字符串,但是由于64位,所以它失败了。

我可以将其与32位十六进制值一起使用:

import binascii
import struct

hex_list = ['40D38700', '40D64700', '40E79700']

for i, value in enumerate(hex_list, 0):
    print(struct.unpack('<f', binascii.unhexlify(hex_list[i].replace(' ', ''))))

结果:

(1.24735742022795e-38,)
(6.597178645388664e-39,)
(1.3950116788944702e-38,)

当我转到64位时:

import binascii
import struct

hex_list_64 = ['40D3970060AA64C3', '40D3970060AA64C3', '40D3970060AA64C3']

for i, value in enumerate(hex_list_64, 0):
    print(struct.unpack('<d', binascii.unhexlify(hex_list_64[i].replace(' ', ''))))

结果:

(-4.653463070196378e+16,)
(-4.653463070196378e+16,)
(-4.653463070196378e+16,)

但是,将40D3970060AA64C3转换为二进制应该产生2.00600059000000001105945557356E4。通过http://www.binaryconvert.com/result_double.html?hexadecimal=40D3970060AA64C3

1 个答案:

答案 0 :(得分:1)

相对于编码方式,您(和我)平台的字节顺序似乎相反:

for value in hex_list_64:
    print(struct.unpack('<d', binascii.unhexlify(value)))

(-4.653463070196378e+16,)
(-4.653463070196378e+16,)
(-4.653463070196378e+16,)

但是

for value in hex_list_64:
    print(struct.unpack('>d', binascii.unhexlify(value)))

(20060.0059,)
(20060.0059,)
(20060.0059,)

这是有道理的,因为英特尔通常在内部将所有内容按低端顺序存储,而按定义将字符串解释为已读时,则按大端顺序定义。