У меня есть двоичный файл, который содержит байтовые множества для представления различных флагов статуса некоторых модулей. Ниже приведен пример структуры в 4 байта:Анализ каждого бита в байтовом потоке с помощью Python
7A 05 00 00
Какой должна быть (в соответствии с HEX-> бен конвертер):
0111 1010 0000 0101 0000 0000 0000 0000
Теперь у меня есть проблемы с чтением в этих байтах и анализировать их в (они в основном представляют истинные/ложные значения).
Если я использую struct.unpack
, я должен использовать Little Endian синтаксический и целое число без знака я думаю, как это:
>>> with open('the_file.dat', 'rb') as f:
... b = f.read(4)
>>> struct.unpack('I', b)[0]
1402
Если преобразовать 1402 обратно в целое, я получаю совершенно разные биты и, конечно, не 32 бита начиная ведущие нули отрезаны:
>>> "{0:b}".format(1402)
'10101111010'
Так что правильный способ разобрать эти биты? В какой-то момент я немного смущен.
UPDATE:
OK Я только что узнал, что спецификатор формата b
использует большой Endian для преобразования целого числа в представляющей битовой строку:
>>> struct.unpack('<I', b)[0]
1402
>>> struct.unpack('>I', b)[0]
2047148032
>>> "{0:b}".format(2047148032)
'1111010000001010000000000000000'
Ведущего ноль (ы) является (являются) по-прежнему не хватает, так это единственный способ, чтобы разобрать биты для заполнения с ведущими нулями, пока не имеют длину 4 байта (32), как это:
>>> "{0:032b}".format(2047148032)
'01111010000001010000000000000000'
Ну, мой редактор шестнадцатеричных (Hex Fiend) показывает '7A050000', а также 1402, как беззнаковое целочисленное значение с небольшим обратным порядком байтов. – tamasgal
Модуль ['bitarray'] (https://pypi.python.org/pypi/bitarray/) может быть хорошей альтернативой использованию' struct'. Он позволяет создавать массивы логических значений из последовательности байтов и будет приводить значения нулевого значения (или «False») так, как вы хотите. Он также поддерживает все варианты endian и относительно быстро, так как он написан на C. – martineau
Огромное спасибо! Я проверю это. – tamasgal