Как читать двоичные данные и печатать в двоичном или шестнадцатеричном формате? - PullRequest
0 голосов
/ 23 января 2020

Я работаю с двоичными данными. У меня есть файл, содержащий 2 КБ двоичных данных. Я использовал следующий код, чтобы прочитать файл, а затем распечатать его. Я также попытался просмотреть содержимое файла с помощью hexdump в терминале. Я получаю различные выходные данные 1 и 2 (показано на приложенных снимках экрана) одного и того же файла в python и hexdump. Я предполагаю, что это может быть связано со схемой кодирования, используемой python? Я очень наивен в работе с двоичными данными. Может кто-нибудь проверить это и сообщить мне причины этого? Я также хочу знать, если это правильный способ чтения большого двоичного файла?

print("First File \n");
f1 = open("/data/SRAMDUMP/dataFiles/first.bin","rb")
num1 = list(f1.read())
print(num1)
f1.close()

PythonOutput Hexdump

1 Ответ

1 голос
/ 23 января 2020

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

Не существует "схемы кодирования" hexdump форматирует двоичные данные как шестнадцатеричные (два полубайта на байт ), вы преобразовали двоичное содержимое файла в список, который выдает список целых чисел (поскольку это то, что байты находятся в python).

Если вы хотите преобразовать байты в печатаемый шестнадцатеричный код в Python, используйте метод bytes.hex. Если вам нужно что-то похожее на hexdump, вам нужно позаботиться о нарезке, пробелах и возврате каретки.

Медленная версия просто прочитает файл 2 байта на 2 байта, зашифрует их, напечатает их, затем перевод строки через каждые 16 байтов. Python 3.8 добавляет средства форматирования в bytes.hex (), что означает, что вы можете еще легче читать байты 16 на 16 с разделителем каждые два, хотя это не совсем соответствует формату hexdump:

f = open(sys.argv[1], 'rb')
it = iter(functools.partial(f.read, 16), '')

for i, b in enumerate(it):
    print(f'{16*i:07x} {b.hex(" ", 2)}')

Также имейте в виду, что hexdump следует по умолчанию порядку байтов платформы, который ... редко бывает тем, что вы хотите, и не будет соответствовать вашему выводу Python. hexdump -C печатает байты в порядке файлов.

...