Pythonic способ создания файлов шестнадцатеричного дампа

StackOverflow https://stackoverflow.com//questions/25005505

  •  20-12-2019
  •  | 
  •  

Вопрос

мой вопрос прост:

Есть ли какой-нибудь способ закодировать эту команду bash на питоническом языке?

hexdump -e '2/1 "%02x"' file.dat

Очевидно, без использования os, popen или каких-либо ярлыков;)

РЕДАКТИРОВАТЬ:хотя я не указал явно, было бы здорово, если бы код работал в Python3.x

Спасибо!

Это было полезно?

Решение

Если вас интересует только Python 2.x, line.encode('hex') закодирует фрагмент двоичных данных в шестнадцатеричный формат.Так:

with open('file.dat', 'rb') as f:
    for chunk in iter(lambda: f.read(32), b''):
        print chunk.encode('hex')

(ИИРК, hexdump по умолчанию печатает 32 пары шестнадцатеричных чисел в строке;если нет, просто измените это 32 к 16 или что это такое…)

Если два аргумента iter выглядит сбивающим с толку, щелкните ссылку справки;это не так уж и сложно, как только вы поймете идею.

Если вас волнует Python 3.x, encode работает только для кодеков, преобразующих строки Unicode в байты;любые кодеки, конвертирующие наоборот (или любую другую комбинацию), вам придется использовать codecs.encode чтобы сделать это явно:

with open('file.dat', 'rb') as f:
    for chunk in iter(lambda: f.read(32), b''):
        print(codecs.encode(chunk, 'hex'))

Или может быть лучше использовать hexlify:

with open('file.dat', 'rb') as f:
    for chunk in iter(lambda: f.read(32), b''):
        print(binascii.hexlify(chunk))

Если вы хотите сделать что-то помимо их распечатки, а не считывать весь файл в память, вам, вероятно, захочется создать итератор.Вы можете просто поместить это в функцию и изменить это print к yield, и эта функция возвращает именно тот итератор, который вам нужен.Или используйте генэкспр или map вызов:

with open('file.dat', 'rb') as f:
    chunks = iter(lambda: f.read(32), b'')
    hexlines = map(binascii.hexlify, chunks)

Другие советы

Стандартная библиотека - ваш друг.Попробуйте binAscii.hexlify () ,

Просто read() и encode('hex') .Что может быть больше питон?

with open('file.dat', 'rb') as f:
    hex_content = f.read().encode('hex')
.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top