Питонский способ к шестнадцатеричным файлам дампа

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

Есть ли способ кодировать эту команду bash на pythonic?

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

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

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

Спасибо!

3 ответа

Решение

Если вы заботитесь только о 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')

(IIRC, 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 и эта функция возвращает именно тот итератор, который вы хотите. Или используйте genexpr или 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')
Другие вопросы по тегам