¿Cómo crear un volcado hexadecimal de archivo que contenga solo los caracteres hexadecimales sin espacios en bash?


188

¿Cómo creo un volcado hexadecimal no modificado de un archivo binario en Linux usando bash? Los comandos ody hexdumpambos insertan espacios en el volcado y esto no es ideal.

¿Hay alguna manera de simplemente escribir una cadena larga con todos los caracteres hexadecimales, menos espacios o nuevas líneas en la salida?


Respuestas:


250

xxd -p file

O si lo quieres todo en una sola línea:

xxd -p file | tr -d '\n'


13
Para invertir el proceso: xxd -r -ps hexascii.txt archivo (está bien con o sin saltos)
Curtis Yallop

92

Las cadenas de formato pueden hacer que hexdump se comporte exactamente como lo desea (sin espacios en blanco, byte por byte):

hexdump -ve '1/1 "%.2x"'

1/1significa "cada formato se aplica una vez y toma un byte", y "%.2x"es la cadena de formato real, como en printf. En este caso: número hexadecimal de 2 caracteres, ceros a la izquierda si es más corto.


77
Necesita un -vo se caerán bytes repetidos y los reemplazará con un asterisco.
Pausado hasta nuevo aviso.

2
Me pregunto si el hexdump en sí mismo puede agregar la nueva línea (solo) al final de la salida ... (el apéndice obvio ; echohace que sea imposible usar como alias bash)
mykhal

2
Mi alias:alias to_hex="hexdump -ve '1/1 \"%.2x\"' && echo"
devstuff

El recuento de iteraciones y el recuento de bytes están predeterminados en uno, por lo que se puede omitir 1/1, dejando elhexdump -ve '"%.2x"'
Alex Che

@mykhal, es posible, si conoce el número de bytes en la salida. Digamos que si usa hexdump para generar solo 13 primeros bytes:hexdump -n 13 -e '13/1 "%.2x" "\n"'
Alex Che


10

Perl one-liner:

perl -e 'local $/; print unpack "H*", <>' file

Verificado Coincide con "xxd -p archivo | tr -d '\ n'".
Curtis Yallop

1
fyi Para revertir el proceso: perl -e 'local $ /; paquete de impresión "H *", archivo <> '<hexascii.txt>
Curtis Yallop

El "local $ /" es innecesario.
Curtis Yallop

Actualización al último comentario: "local $ /" es innecesario para "paquete". Para descomprimirlo, lo necesita, pero también puede poner "undef $ /". $ / es el separador de línea (NL predeterminado). undefined lo pone en modo slurp. Entonces <> referenciado en un contexto de cadena extrae todo el archivo binario sin analizarlo en líneas.
Curtis Yallop

Forma alternativa: perl -e 'imprimir descomprimir "H *", unirse ("", <>)' <archivo
Curtis Yallop

2

Las otras respuestas son preferibles, pero para una solución Bash pura, he modificado el script en mi respuesta aquí para poder generar un flujo continuo de caracteres hexadecimales que representan el contenido de un archivo. (Su modo normal es emular hexdump -C).

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.