forma pitónica de volcar archivos hexadecimales
Pregunta
mi pregunta es simple:
¿Hay alguna forma de codificar de forma pitónica ese comando bash?
hexdump -e '2/1 "%02x"' file.dat
Obviamente, sin usar os, popen ni ningún atajo ;)
EDITAR:aunque no lo he especificado explícitamente, sería fantástico si el código fuera funcional en Python3.x
¡Gracias!
Solución
Si solo te importa Python 2.x, line.encode('hex')
codificará un trozo de datos binarios en hexadecimal.Entonces:
with open('file.dat', 'rb') as f:
for chunk in iter(lambda: f.read(32), b''):
print chunk.encode('hex')
(IIRC, hexdump
de forma predeterminada imprime 32 pares de hexadecimales por línea;si no, simplemente cambia eso 32
a 16
o lo que sea…)
Si los dos argumentos iter
parece desconcertante, haga clic en el enlace de ayuda;No es demasiado complicado una vez que tienes la idea.
Si te interesa Python 3.x, encode
sólo funciona para códecs que convierten cadenas Unicode a bytes;cualquier códec que convierta al revés (o cualquier otra combinación), debe usar codecs.encode
para hacerlo explícitamente:
with open('file.dat', 'rb') as f:
for chunk in iter(lambda: f.read(32), b''):
print(codecs.encode(chunk, 'hex'))
O tal vez sea mejor usar hexlify
:
with open('file.dat', 'rb') as f:
for chunk in iter(lambda: f.read(32), b''):
print(binascii.hexlify(chunk))
Si desea hacer algo además de imprimirlos, en lugar de leer el archivo completo en la memoria, probablemente desee crear un iterador.Podrías simplemente poner esto en una función y cambiar eso. print
a un yield
, y esa función devuelve exactamente el iterador que desea.O usar un genexpr o map
llamar:
with open('file.dat', 'rb') as f:
chunks = iter(lambda: f.read(32), b'')
hexlines = map(binascii.hexlify, chunks)
Otros consejos
La biblioteca estándar es tu amigo.Pruebe binascii.hexlify () .
Simplemente read()
El archivo completoy encode('hex')
.¿Qué podría ser más Pythonic?
with open('file.dat', 'rb') as f:
hex_content = f.read().encode('hex')