Python: странные числа, извлекаемые из двоичного файла / путаница с шестнадцатеричными и десятичными числами - PullRequest
1 голос
/ 27 января 2010

Это может быть очень тривиально, и если да, то я извиняюсь, но я действительно запутался с полученными результатами: hex? десятичный? что?

Вот пример и что он возвращает:

>>> print 'Rx State: ADC Clk=', ADC_Clock_MHz,'MHz DDC Clk=', DDC_Clock_kHz,'kHz Temperature=', Temperature,'C'
Rx State: ADC Clk= [1079246848L, 0L] MHz DDC Clk= [1078525952L, 0L] kHz Temperature= [1078140928L, 0L] C

Теперь я признаю, что это легкая догадка, потому что я не знаю точно, что это за данные - у меня есть спецификация, как разобрать их в файле, но это дает мне очень странные ответы.

Как видите, значения очень похожи, все вокруг отметки 1078000000, что наводит меня на мысль, что я могу извлечь что-то странное (например, hex, но я не думаю, что это ...)

Структура читается следующим образом (извинения за длину):

#Read block
    more = 1
    while(more == 1):
        a = array.array("L")
        a.fromfile(wholeFile,2)
        if len(a) == 2:
            structure_id = a[0]
            print 'structure_id: ', hex(structure_id)
            structure_length = a[1]
            print 'structure_length: ', structure_length
        else:
            print 'cannot read structure start'

        numDwords = (structure_length/4) - 2 - 1;
        print 'numDwords: ', numDwords

        content = array.array("L")
        content.fromfile(wholeFile,numDwords)
        if len(content) != numDwords:
            print 'cannot read structure'
            more = 0
            ok = 0

, а затем приведенный выше пример был получен из этого по:

pos = 2
v1 = [content[pos+1], content[pos]]
pos = pos+2
v2 = [content[pos+1], content[pos]]
pos = pos+2
v3 = [content[pos+1], content[pos]]
pos = pos+2

ADC_Clock_MHz = v1
DDC_Clock_kHz = v2
Temperature = v3

Еще раз прошу прощения за то, насколько это было многословно, но это не просто эти значения, кажется, что некоторые значения в порядке, а некоторые нет, что приводит меня к мысли, что большие числа кодируются по-разному ... Также у меня нет Идея, почему все значения в парах тоже!

Вопрос о штанах, но если у кого-то есть понимание, это будет высоко оценено.

Ответы [ 3 ]

0 голосов
/ 27 января 2010

Возможно, вам понравится что-то вроде следующего, чтобы прочитать этот блок.

Если ваши данные распаковываются неправильно, наиболее вероятной причиной является то, что заголовок - это не просто 2 длинных целых числа. Или, возможно, что он не отражает «порядковый номер» вашей платформы.

Использование struct позволяет добавить "<" или ">" в строку формата, чтобы попробовать другой порядок байтов. Кроме того, вы можете легко изменить формат сообщения, чтобы использовать обычные целые числа или подписанные целые числа или числа с плавающей запятой без особой работы.

import struct
def read( someFile ):
    header= someFile.read( 8 )
    id, length = struct.unpack( "LL", header )
    print id, length
    body = someFile.read( length-8 ) # Common for length to include the header
    words = (length-8)//4
    content= struct.unpack( "L"*words, body )

Вы также можете напечатать repr(header) и repr(body), чтобы попытаться лучше понять, как на самом деле выглядят ваши данные.

0 голосов
/ 15 февраля 2010

Обнаружено, что это невероятно легко сделать с помощью numpy.fromfile

Укажите, что вы хотите извлечь (например, uint32, int16 и т. Д.), И оно будет извлечено как массив. Вы даже можете указать свои собственные типы как набор существующих типов, то есть вы можете извлечь известные структуры за один раз (например, 2 uint32s, затем 1 строка, затем 5 int16s, как массив из 8 значений)

0 голосов
/ 27 января 2010

Содержимое в парах, потому что вы назначаете пару для переменных (например, ADC_Clock_MHz = v1 и v1 = [content[pos+1], content[pos]]).

Вы в основном назначаете список из двух элементов v1, где первый элемент - это элемент в индексе pos+1 в массиве content, а второй элемент - это элемент в индексе pos в массив content.

Я немного запутался, почему вы строите этот список этих двух элементов. Вы пытаетесь объединить два элемента в одно число? Я думаю, что вы должны рассказать нам немного больше о формате файла, если можете. Это домашнее задание?

И нет, вывод не шестнадцатеричный, а десятичный. Я думаю, что вы неправильно читаете данные из двоичного файла.

...