在Python中从hex转换为double

kam*_*ame 4 python double hex

Python:从hex转换为double

这是价值

value = ['\x7f', '\x15', '\xb7', '\xdb', '5', '\x03', '\xc0', '@']
Run Code Online (Sandbox Code Playgroud)

我试过了

unpack('d', value)
Run Code Online (Sandbox Code Playgroud)

但他需要一个字符串来拆包.现在是一个清单.但是当我将其更改为字符串时,长度将从8更改为58.但是double需要长度为8的值.

Mar*_*ers 12

使用''.joinjoin将列表转换为字符串:

>>> 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,)
Run Code Online (Sandbox Code Playgroud)


Joh*_*ooy 7

请注意,有两种方法可以将它转换为double,这取决于cpu是bigendian oe littleendian,所以最好明确指出你想要哪一个

>>> 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
Run Code Online (Sandbox Code Playgroud)

而且只是为了好玩 - 这里是如何明确解码double

>>> 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
Run Code Online (Sandbox Code Playgroud)