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

Respuestas:

250

xxd -p file

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

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

mark4o
fuente
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.

Michał Trybus
fuente
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
24

Parece depender de los detalles de la versión de od. En OSX, use esto:

od -t x1 -An file |tr -d '\n '

(Eso se imprime como bytes hexadecimales tipo, sin dirección. Y espacios en blanco eliminados después, por supuesto).

Compañeros de Donal
fuente
1
También agregaría -ven este contexto, de lo contrario, omite las repeticiones con *.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
10

Perl one-liner:

perl -e 'local $/; print unpack "H*", <>' file
Alan Haggai Alavi
fuente
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).

Pausado hasta nuevo aviso.
fuente