从十六进制解包为双精度浮点数在Python中
Python:从十六进制转换为双精度浮点数
这是一个值
value = ['\x7f', '\x15', '\xb7', '\xdb', '5', '\x03', '\xc0', '@']
我试过
unpack('d', value)
但是他需要一个字符串来进行解包。现在它是一个列表。但当我把它改成字符串时,长度会从8变成58。但是双精度浮点数需要的长度是8。
4 个回答
1
注意,在实际使用之前,请先确认一下数值。可以使用下面的函数将十六进制(HEX)转换为双精度浮点数(Double),或者将双精度浮点数转换为十六进制。
>>> import struct
>>> def double_to_hex(f):
return hex(struct.unpack('<Q', struct.pack('<d', f))[0])
>>> def hex_to_double(f):
return struct.unpack('!d', bytes.fromhex(f))[0]
>>> data = 12.982947
>>> hex_value = double_to_hex(data)
>>> print(hex_value)
0x4029f744d4456712
>>> double_value = hex_to_double(hex_value[2:])
>>> print(double_value)
12.982947
7
请注意,根据你的电脑是大端字节序还是小端字节序,有两种方法可以把这个转换成双精度浮点数(double)。所以最好明确你想要哪一种。
>>> from struct import unpack
>>> value = ['\x7f', '\x15', '\xb7', '\xdb', '5', '\x03', '\xc0', '@']
>>> unpack('<d', ''.join(value))[0]
8198.42076767492
>>> unpack('>d', ''.join(value))[0]
1.4893584640656973e+304
为了好玩,这里是如何明确解码这个双精度浮点数的方法。
>>> value = ['\x7f', '\x15', '\xb7', '\xdb', '5', '\x03', '\xc0', '@']
>>> bytes = map(ord,reversed(value))
>>> sign = (1,-1)[bytes[0]>>7]
>>> exp = ((0x7f&bytes[0])<<4) + (bytes[1]>>4) - 1023
>>> mantissa = reduce(lambda x,y: (x<<8) + y, bytes[2:], bytes[1]&0xf)
>>> sign*2**exp*(1+mantissa*2**-52)
8198.4207676749193
12
使用 ''.join
方法可以把列表转换成字符串:
>>> value = ['\x7f', '\x15', '\xb7', '\xdb', '5', '\x03', '\xc0', '@']
>>> ''.join(value)
'\x7f\x15\xb7\xdb5\x03\xc0@'
>>> from struct import unpack
>>> unpack('d', ''.join(value))
(8198.4207676749193,)