diferencia de formato hexdump vs xxd


9

Estaba buscando cómo hacer un hexdump inverso y encontré xxd mencionado. Sin embargo, no parece funcionar simplemente con:

xxd -r hexdumpfile > binaryfile

Luego comparé la diferencia entre las salidas de xxd infiley hexdump infile, y encontré tres diferencias:

  1. La salida xxd tiene dos puntos después de la dirección
  2. La salida xxd tiene las posiciones en los datos invertidas (por ejemplo, 5a42en la salida hexdump se convierte 425aen la salida xxd)
  3. Hay algunos caracteres adicionales después de cada línea.

Solo tengo la versión hexdumped de ciertos archivos en un servidor. ¿Cómo puedo recuperar correctamente los datos binarios usando xxd?


Estaba buscando alguna opción en xxd para tomar en formato hexdump, pero por ahora, logré hacerlo con algunas operaciones simples de sed
tanon

Realmente no he probado exactamente lo que pides, pero prueba xxd -p y -b, -p es simple -b es binario, así como tu -r. En cuanto al orden de bytes, eso tiene que ver con big endian y little endian, y tal vez xxd no puede revertir eso ... pero está relacionado con la forma en que se almacenan los bytes en el archivo. Como, si tiene un archivo de texto en el bloc de notas , puede guardarlo como big endian unicode de 16 bits, little endian o UTF-8 o lo que sea, y verá la diferencia con xxd. El comando od puede mostrarlo de manera diferente.
barlop

Para referencia futura, le hexdumppermite elegir la endianness utilizada en su salida, lo que podría simplificar esto. (¿Por qué ahora? Tu pregunta fue útil para algo no relacionado.)
jpaugh

Respuestas:


7

No conozco ningún comando que haga la conversión, pero se puede dividir fácilmente en unos pocos pasos:

  1. Elimine las direcciones de la hexdumpsalida usandosed
  2. Convertir a binario usando xxd
  3. Conversión endiana (por ejemplo, se 5a42convierte 425a) usandodd

Aquí está el comando completo:

sed 's/^[0-9]*//' hexdump | xxd -r -p | dd conv=swab of=binaryfile

no funciona si el hexdump termina con 0a
Smeterlink

1

Esta respuesta es una publicación cruzada de https://stackoverflow.com/a/52834021/6770384

Puedes hacer la conversión en un solo sedcomando. Es suficiente agregar :después de la dirección y cambiar la endianness (cambiar ab12a 12ab).

sed -E 's/ /: /;s/ (..)(..)/ \2\1/g;$d' dump | xxd -r

Errores conocidos (ver sección de comentarios)

  • Se agrega un byte nulo final si el archivo original tenía una longitud impar (por ejemplo, 1, 3, 5, 7, ..., byte largo).
  • Las secciones repetidas del archivo original no se restauran correctamente si se editaron hexdumpcon a  *.

no funciona si el hexdump termina con 0a
Smeterlink

@Smeterlink ¡Gracias por esta observación! Tiene razón: este comando produce un byte nulo final que no estaba en el archivo original si la longitud en bytes era un número impar. También encontré otro error. hexdumppuede ocultar partes repetidas usando a *. Este comando tampoco puede restaurar estas partes correctamente. Ejemplo: yes | head -n100 | hexdump | sed -E 's/ /: /;s/ (..)(..)/ \2\1/g' | xxd -rimprime solo 8 en ylugar de 100. Arreglar estas cosas requeriría más que esta línea. Tal vez agregue otro script en el futuro.
Socowi

gracias por la informacion *, no lo sabia!
Smeterlink
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.