maneira pitônica de hexadecimal arquivos de despejo
Pergunta
minha pergunta é simples:
Existe alguma maneira de codificar de forma python esse comando bash?
hexdump -e '2/1 "%02x"' file.dat
Obviamente, sem usar os, popen ou qualquer atalho;)
EDITAR:embora eu não tenha especificado explicitamente, seria ótimo se o código fosse funcional em Python3.x
Obrigado!
Solução
Se você se preocupa apenas com Python 2.x, line.encode('hex')
codificará um pedaço de dados binários em hexadecimal.Então:
with open('file.dat', 'rb') as f:
for chunk in iter(lambda: f.read(32), b''):
print chunk.encode('hex')
(IIRC, hexdump
por padrão imprime 32 pares de hexadecimais por linha;se não, basta mudar isso 32
para 16
ou o que quer que seja…)
Se os dois argumentos iter
parece desconcertante, clique no link de ajuda;não é muito complicado depois que você entende a ideia.
Se você se preocupa com Python 3.x, encode
funciona apenas para codecs que convertem strings Unicode em bytes;quaisquer codecs que convertem ao contrário (ou qualquer outra combinação), você deve usar codecs.encode
fazer isso explicitamente:
with open('file.dat', 'rb') as f:
for chunk in iter(lambda: f.read(32), b''):
print(codecs.encode(chunk, 'hex'))
Ou pode ser melhor usar hexlify
:
with open('file.dat', 'rb') as f:
for chunk in iter(lambda: f.read(32), b''):
print(binascii.hexlify(chunk))
Se você quiser fazer algo além de imprimi-los, em vez de ler o arquivo inteiro na memória, provavelmente desejará criar um iterador.Você poderia simplesmente colocar isso em uma função e mudar isso print
para um yield
, e essa função retorna exatamente o iterador que você deseja.Ou use um geneexpr ou map
chamar:
with open('file.dat', 'rb') as f:
chunks = iter(lambda: f.read(32), b'')
hexlines = map(binascii.hexlify, chunks)
Outras dicas
A biblioteca padrão é sua amiga.Tentar binascii.hexlify().
Simplesmente read()
todo o arquivo e encode('hex')
.O que poderia ser mais pitônico?
with open('file.dat', 'rb') as f:
hex_content = f.read().encode('hex')