Преобразование из двойного C передается в две шестнадцатеричные строки - PullRequest
8 голосов
/ 16 июля 2011

мой самый первый день с Python.

Мне нравится фильтровать файл трассировки, сгенерированный C. Каждая двойная буква C отформатирована в файле двумя шестнадцатеричными строками, представляющими 32-битные из 64 двойных.

например, 1234567890.3 (C double)
внутри файла:

0xb4933333
0x41d26580

Как я могу проанализировать и объединить его для дальнейшей работы с поплавком Python?

Заранее спасибо

Ответы [ 2 ]

9 голосов
/ 16 июля 2011

Вы можете использовать struct, используя модификатор 'd' для 'double':

>>> import struct
>>> num1 = '0xb4933333'
>>> num2 = '0x41d26580'
>>> struct.unpack('!d', (num2[2:]+num1[2:]).decode('hex'))[0]
1234567890.3

Будьте внимательны, в каком порядке вы добавляете удвоения, в приведенном выше примере предполагается машина с прямым порядком байтовКроме того, я удалил 0x, поскольку функция decode не ожидает этого.

edit: если вы используете Python 3, вам нужно использовать bytes.fromhex вместо ''.decode('hex').


Просто чтобы дать альтернативу (приведенное выше очень хорошее решение):

>>> import struct
>>> num1 = '0xb4933333'
>>> num2 = '0x41d26580'
>>> low_word = int(num1, 16)
>>> high_word = int(num2, 16)
>>> representation = struct.pack('>II', high_word, low_word)
>>> result = struct.unpack('>d', representation)
>>> result[0]
1234567890.3
0 голосов
/ 16 июля 2011

Вот стандарт IEEE для чисел с плавающей запятой и способ его создания:

http://www.psc.edu/general/software/packages/ieee/ieee.php

...