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!

Foi útil?

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')
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top