Питонский способ к шестнадцатеричным файлам дампа
Мой вопрос прост:
Есть ли способ кодировать эту команду 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')