Управление двоичными данными в Python

Я открываю двоичный файл как так:

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

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

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

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

16
задан Samuel Dare 13 May 2018 в 14:11
поделиться

6 ответов

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

print repr(data)

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

print data.encode('hex')

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

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

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

24
ответ дан 30 November 2019 в 17:04
поделиться

\ 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)
4
ответ дан 30 November 2019 в 17:04
поделиться

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

2
ответ дан 30 November 2019 в 17:04
поделиться

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

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

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

1
ответ дан 30 November 2019 в 17:04
поделиться

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

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

1
ответ дан 30 November 2019 в 17:04
поделиться

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

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

'\ x07' - это символ ASCII BEL, который изначально использовался для звонка в звонок на телетайпе.

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

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

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

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

2
ответ дан 30 November 2019 в 17:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: