Распаковать с шестнадцатеричного на двойной в Python - PullRequest
4 голосов
/ 20 августа 2010

Python: распаковать с шестнадцатеричного на двойной

Это значение

value = ['\x7f', '\x15', '\xb7', '\xdb', '5', '\x03', '\xc0', '@']

Я пытался

unpack('d', value)

но ему нужна строка для распаковки. Это список сейчас. Но когда я изменяю его на строку, длина меняется с 8 на 58. Но для двойного нужно значение длины 8.

Ответы [ 2 ]

12 голосов
/ 20 августа 2010

Используйте ''.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,)
7 голосов
/ 20 августа 2010

Обратите внимание, что есть два способа преобразовать это число в двойное, в зависимости от того, является ли процессор бигендианским или 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

, и просто для удовольствия- вот как явно расшифровать дубль

>>> 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
...