Как читать двоичный файл в Python - PullRequest
2 голосов
/ 05 октября 2011

В Python, когда я пытаюсь прочитать исполняемый файл с 'rb', вместо того, чтобы получить ожидаемые двоичные значения (0010001 и т. Д.), Я получаю серию букв и символов, которые я не знаю, чтоделать с.

Ex: ???}????l?S??????V?d?\?hG???8?O=(A).e??????B??$????????:    ???Z?C'???|lP@.\P?!??9KRI??{F?AB???5!qtWI??8????!ᢉ?]?zъeF?̀z??/?n??

Как получить доступ к двоичным номерам файла в Python?

Буду признателен за любые предложения или помощь.Заранее спасибо.

Ответы [ 5 ]

6 голосов
/ 05 октября 2011

Это двоичный файл. Они хранятся в байтах, и при их печати они интерпретируются как символы ASCII.

Вы можете использовать функцию bin () и функцию ord () , чтобы увидеть действительные двоичные коды.

for value in enumerate(data):
   print bin(ord(value))
4 голосов
/ 05 октября 2011

Последовательности байтов в Python представлены с использованием строк. Последовательность букв и символов, которые вы видите при распечатке последовательности байтов, является просто печатным представлением байтов, которое содержит строка. Чтобы использовать эти данные, вы обычно манипулируете ими для получения более полезного представления.

Вы можете использовать ord(x) или bin(x) для получения десятичного и двоичного представлений соответственно:

>>> f = open('/tmp/IMG_5982.JPG', 'rb')
>>> data = f.read(10)
>>> data
'\x00\x00II*\x00\x08\x00\x00\x00'

>>> data[2]
'I'

>>> ord(data[2])
73

>>> hex(ord(data[2]))
'0x49'

>>> bin(ord(data[2]))
'0b1001001'

>>> f.close()

Флаг 'b', который вы передаете open(), ничего не говорит Python о том, как представлять содержимое файла. С Документы :

Добавьте 'b' к режиму, чтобы открыть файл в двоичном режиме, в системах, которые различают двоичные и текстовые файлы; в системах, которые не имеют этого различия, добавление 'b' не имеет никакого эффекта.

Если вы просто не хотите посмотреть, как выглядят двоичные данные из файла, в книге Марка Пилигрима, Dive Into Python, есть пример работы с двоичными форматами файлов. Пример показывает, как вы можете прочитать теги IDv1 из файла MP3. Сайт книги, кажется, не работает, поэтому я делаю ссылку на зеркало.

3 голосов
/ 05 октября 2011

Каждый символ в строке является ASCII-представлением двоичного байта.Если вы хотите, чтобы это была строка из нулей и единиц, вы можете преобразовать каждый байт в целое число, отформатировать его как 8 двоичных цифр и объединить все вместе:

>>> s = "hello world"
>>> ''.join("{0:08b}".format(ord(x)) for x in s)
'0110100001100101011011000110110001101111001000000111011101101111011100100110110001100100'

В зависимости от того, действительно ли вам нужно проанализировать /манипулировать вещами на двоичном уровне может помочь внешний модуль, такой как bitstring .Проверьте документы ;чтобы просто получить двоичную интерпретацию, используйте что-то вроде:

>>> f = open('somefile', 'rb')
>>> b = bitstring.Bits(f)
>>> b.bin
0100100101001001...
0 голосов
/ 05 октября 2011

Если вы действительно хотите преобразовать бинарные байты в поток битов, вы должны удалить первые два символа ('0b') из вывода bin() и инвертировать результат:

with open("settings.dat", "rb") as fp:
    print "".join( (bin(ord(c))[2:][::-1]).ljust(8,"0") for c in fp.read() )

Если вы используете Python до версии 2.6, у вас нет функции bin().

0 голосов
/ 05 октября 2011

Используйте ord(x) для получения целочисленного значения каждого байта.

>>> with open('settings.dat', 'rb') as file:
...     data = file.read()
...
>>> for index, value in enumerate(data):
...     print '0x%08x 0x%02x' % (index, ord(value))
...
0x00000000 0x28
0x00000001 0x64
0x00000002 0x70
0x00000003 0x30
0x00000004 0x0d
0x00000005 0x0a
0x00000006 0x53
0x00000007 0x27
0x00000008 0x4d
0x00000009 0x41
0x0000000a 0x49
0x0000000b 0x4e
0x0000000c 0x5f
0x0000000d 0x57
0x0000000e 0x49
0x0000000f 0x4e
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...