Получение необработанного двоичного представления файла в Python - PullRequest
4 голосов
/ 23 января 2011

Я бы хотел получить точную последовательность битов из файла в строку, используя Python 3. Есть несколько вопросов на эту тему, которые близки, но не совсем отвечают на них.Пока что у меня есть это:

>>> data = open('file.bin', 'rb').read()
>>> data
'\xa1\xa7\xda4\x86G\xa0!e\xab7M\xce\xd4\xf9\x0e\x99\xce\xe94Y3\x1d\xb7\xa3d\xf9\x92\xd9\xa8\xca\x05\x0f$\xb3\xcd*\xbfT\xbb\x8d\x801\xfanX\x1e\xb4^\xa7l\xe3=\xaf\x89\x86\xaf\x0e8\xeeL\xcd|*5\xf16\xe4\xf6a\xf5\xc4\xf5\xb0\xfc;\xf3\xb5\xb3/\x9a5\xee+\xc5^\xf5\xfe\xaf]\xf7.X\x81\xf3\x14\xe9\x9fK\xf6d\xefK\x8e\xff\x00\x9a>\xe7\xea\xc8\x1b\xc1\x8c\xff\x00D>\xb8\xff\x00\x9c9...'

>>> bin(data[:][0])
'0b11111111'

ОК, я могу получить число с номером 2, но я не понимаю, почему data [:] [x], и у меня все еще ведущий 0b.Также может показаться, что мне нужно перебрать всю строку и выполнить приведение и разбор, чтобы получить правильный вывод.Есть ли более простой способ получить последовательность 01 без циклов, разборов и конкатенации строк?

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

Ответы [ 4 ]

6 голосов
/ 23 января 2011

Сначала я бы вычислил строковое представление для всех значений 0..255

bytetable = [("00000000"+bin(x)[2:])[-8:] for x in range(256)]

или, если вы предпочитаете биты в младших битах для порядка MSB

bytetable = [("00000000"+bin(x)[2:])[-1:-9:-1] for x in range(256)]

, то для всего файлав двоичном виде можно получить с помощью

binrep = "".join(bytetable[x] for x in open("file", "rb").read())
2 голосов
/ 23 января 2011

Если вы в порядке, используя внешний модуль, он использует цепочку битов :

>>> import bitstring
>>> bitstring.BitArray(filename='file.bin').bin[2:]
'110000101010000111000010101001111100...'

и все. Он просто принимает двоичное строковое представление всего файла и обрезает только один начальный '0b'.

2 голосов
/ 23 января 2011

Не совсем понятно, какой должна быть последовательность битов. Я думаю, что было бы наиболее естественно начать с байта 0 с бита 0, но на самом деле это зависит от того, что вы хотите.

Итак, вот некоторый код для доступа к последовательности битов, начинающейся с бита 0 в байте 0:

def bits_from_char(c):
    i = ord(c)
    for dummy in range(8):
        yield i & 1
        i >>= 1

def bits_from_data(data):
    for c in data:
        for bit in bits_from_char(c):
            yield bit

for bit in bits_from_data(data):
    #  process bit

(Еще одно примечание: вам не понадобится data[:][0] в вашем коде. Просто data[0] сделает трюк, но без предварительного копирования всей строки.)

1 голос
/ 15 января 2017

Для преобразования необработанных двоичных данных, таких как b'\xa1\xa7\xda4\x86', в цепочку битов, которая представляет данные как число в двоичной системе (base-2) в Python 3:

>>> data = open('file.bin', 'rb').read()
>>> bin(int.from_bytes(data, 'big'))[2:]
'1010000110100111110110100011010010000110...'

См. Преобразование двоичного файлав ASCII и наоборот .

...