Pythonic способ создания файлов шестнадцатеричного дампа
Вопрос
мой вопрос прост:
Есть ли какой-нибудь способ закодировать эту команду 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')
.