我有一个要存储为字符串的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
答案 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,)
这是有道理的,因为英特尔通常在内部将所有内容按低端顺序存储,而按定义将字符串解释为已读时,则按大端顺序定义。