2010-06-17 2 views
15

Я открывает двоичный файл следующим образом:Манипулирования двоичных данных в Python

file = open("test/test.x", 'rb') 

и чтения в строках в список. Каждая строка выглядит примерно так:

'\xbe\x00\xc8d\xf8d\x08\xe4.\x07~\x03\x9e\x07\xbe\x03\xde\x07\xfe\n' 

Мне сложно манипулировать этими данными. Если я попытаюсь напечатать каждую строку, python замерзает и испускает звуковые сигналы (я думаю, там где-то есть двоичный звуковой код). Как я могу безопасно использовать эти данные? Как преобразовать каждый шестнадцатеричный номер в десятичный?

ответ

23

Чтобы распечатать его, вы можете сделать что-то вроде этого:

print repr(data) 

Для всего этого в шестнадцатеричном:

print data.encode('hex') 

Для получения десятичного значения каждого байта:

print ' '.join([str(ord(a)) for a in data]) 

Чтобы распаковать двоичные целые числа и т. Д. Из данных, как если бы они были первоначально получены из структуры C-стиля, посмотрите на модуль struct.

+0

Спасибо! Это то, что я искал! –

1

Вы пытаетесь распечатать данные, преобразованные в символы ASCII, которые не будут работать.

Вы можете безопасно использовать любой байт данных. Если вы хотите напечатать его как шестнадцатеричное, рассмотрим функции ord и hex/

2

Как упомянутый выше театром, орды и гексагоны могут вам помочь. Если вы хотите попытаться интерпретировать какие-то структурированные двоичные данные в файле, может оказаться полезным модуль struct.

+2

+1 для структуры. Правильный путь для интерпретации упакованных двоичных данных. –

3

\xhh is the character with hex value hh. Другие символы, такие как . и `~ ', являются нормальными символами.

Итерация на строке дает вам символы в ней, по одному за раз.

ord(c) will return an integer representing the character. E.g., ord('A') == 65.

Это напечатает десятичных чисел для каждого символа:

s = '\xbe\x00\xc8d\xf8d\x08\xe4.\x07~\x03\x9e\x07\xbe\x03\xde\x07\xfe\n' 
print ' '.join(str(ord(c)) for c in s) 
+2

Обратите внимание, что \ x07 - это символ ASCII BEL. Вот что вызывает звуковой сигнал. – dan04

1

Вы используете read() или readline()? Вы должны использовать read(n) для чтения n байтов; readline() будет читать до тех пор, пока не ударит строку новой строки, которой может не быть двоичный файл.

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

Что вы хотите, это ord(), который преобразует однобайтную строку в соответствующее целочисленное значение. read() из файла по одному байту за раз и вызывать ord() по результату или перебирать всю строку.

2

Двоичные данные редко делятся на «линии», разделенные «\ n».Если это так, он будет иметь неявный или явный механизм эвакуации, чтобы различать «\ n» как ограничитель строки и «\ n» как часть данных. Чтение такого файла, как строки вслепую без знания механизма эвакуации, бессмысленно.

Чтобы ответить на ваши конкретные проблемы:

«\ X07» является BEL символов ASCII, который был первоначально для звона колокола на телетайп машины.

Вы можете получить целочисленное значение байта 'b', выполнив ord(b).

ОДНАКО, чтобы обработать двоичные данные правильно, вам нужно знать, что такое макет. Вы можете иметь целые числа без знака (размер 1, 2, 4, 8 байт), числа с плавающей запятой, десятичные числа различной длины, строки фиксированной длины, строки с переменной длиной и т. Д. И т. Д. Добавлено осложнение происходит от того, записаны ли данные в бигэндианской моде или littleendian fashion. После того, как вы узнаете все вышеизложенное (или имеете очень хорошие обоснованные предположения), Python struct module должен быть способен использоваться для всей или большей части вашей обработки; ctypes module также может быть полезен.

Имеет ли формат данных имя? Если да, скажите нам; мы можем указать вам код или документы.

Вы спрашиваете: «Как я могу безопасно использовать эти данные?» который задает вопрос: для чего вы хотите его использовать? Какие манипуляции вы хотите сделать?

Смежные вопросы