Я открываю двоичный файл как так:
file = open("test/test.x", 'rb')
и чтение в строках к списку. Каждая строка смотрит немного как:
'\xbe\x00\xc8d\xf8d\x08\xe4.\x07~\x03\x9e\x07\xbe\x03\xde\x07\xfe\n'
Мне нелегко управлять этими данными. Если я пытаюсь распечатать каждую строку, замораживания Python, и испускает подающие звуковой сигнал шумы (я думаю, что существует двоичный код звукового сигнала там где-нибудь). Как я иду об использовании этих данных безопасно? Как я могу преобразовать каждое шестнадцатеричное число в десятичное число?
Чтобы распечатать это, вы можете сделать что-то вроде этого:
print repr(data)
Для всего в шестнадцатеричном виде:
print data.encode('hex')
Для десятичного значения каждого байта:
print ' '.join([str(ord(a)) for a in data])
Чтобы распаковать двоичные целые числа, и т. д. из данных, как если бы они изначально были получены из структуры в стиле C, посмотрите на модуль struct .
\ xhh
- это символ с шестнадцатеричным значением hh . Другие символы, например .
и `~ '- обычные символы.
Итерация по строке дает вам символы в ней по одному.
ord (c)
вернет целое число, представляющее символ. Например, 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)
Как упомянул theatrus, вам могут помочь ord и hex. Если вы хотите попытаться интерпретировать некоторые структурированные двоичные данные в файле, вам может помочь модуль struct.
Используете ли вы read ()
или readline ()
? Вы должны использовать read (n)
для чтения n байтов; readline ()
будет читать, пока не достигнет новой строки, которой в двоичном файле может не быть.
Однако в любом случае вам будет возвращена строка байтов, которая может быть печатаемыми или непечатаемыми символами и, вероятно, не очень полезна.
Вам нужна функция ord ()
, которая преобразует однобайтовую строку в соответствующее целочисленное значение. read ()
из файла по одному байту и вызов ord ()
для результата или итерация по всей строке.
Вы пытаетесь распечатать данные, преобразованные в символы ASCII, но это не сработает.
Вы можете безопасно использовать любой байт данных. Если вы хотите распечатать его в шестнадцатеричном формате, посмотрите на функции ord
и шестнадцатеричный
/
Двоичные данные редко разделяются на «строки», разделенные символом '\ n'. Если это так, у него будет неявный или явный механизм escape, чтобы различать "\ n" как признак конца строки и '\ n' как часть данных. Считывать такой файл как строки вслепую, не зная механизма выхода, бессмысленно.
Чтобы ответить на ваши конкретные вопросы:
'\ x07' - это символ ASCII BEL, который изначально использовался для звонка в звонок на телетайпе.
Вы можете получить целочисленное значение байта 'b', выполнив ord (b)
.
ОДНАКО, чтобы правильно обрабатывать двоичные данные, вам нужно знать, что такое макет . У вас могут быть целые числа со знаком и без знака (размером 1, 2, 4, 8 байтов), числа с плавающей запятой, десятичные числа различной длины, строки фиксированной длины, строки переменной длины и т.д. в бигендской моде или в маленькой индийской моде. Как только вы узнаете все вышеперечисленное (или получите очень хорошие обоснованные предположения), модуль структуры Python сможет использоваться для всей или большей части вашей обработки; также может быть полезен модуль ctypes .
Есть ли у формата данных название? Если да, сообщите нам; мы можем указать вам на код или документы.
Вы спрашиваете: «Как мне безопасно использовать эти данные?» Возникает вопрос: для чего вы хотите его использовать? Какие манипуляции вы хотите проделать?