hexdump vs xxd differenza di formato


9

Stavo cercando come fare un hexdump inverso e ho trovato xxd menzionato. Tuttavia, non sembra funzionare semplicemente:

xxd -r hexdumpfile > binaryfile

Ho quindi confrontato la differenza tra le uscite di xxd infilee hexdump infilee ho trovato tre differenze:

  1. L'output xxd ha i due punti dopo l'indirizzo
  2. xxd output ha le posizioni nei dati invertite (ad esempio, 5a42in hexdump l'output diventa 425ain xxd output)
  3. Ci sono alcuni caratteri extra dopo ogni riga

Ho solo la versione hexdumped di alcuni file su un server. Come posso recuperare correttamente i dati binari usando xxd?


Stavo cercando qualche opzione in xxd da prendere in formato hexdump, ma per ora, sono riuscito a farlo con alcune semplici operazioni sed
tanon,

Non ho davvero testato esattamente quello che chiedi, ma prova xxd -p e -b, -p è semplice -b è binario, così come il tuo -r. Per quanto riguarda l'ordine dei byte, questo avrebbe a che fare con big endian e little endian, e forse xxd non può invertirlo .. ma è correlato al modo in cui i byte sono memorizzati nel file. Come se avessi un file di testo nel blocco note , puoi salvarlo come big endian unicode a 16 bit, o little endian o UTF-8 o qualsiasi altra cosa e vedi la differenza da xxd. Il comando od potrebbe visualizzarlo in modo diverso.
barlop

Per riferimento futuro, hexdumpti permette di scegliere l'endianness usata nel suo output, il che potrebbe renderlo più semplice. (Perché adesso? Hai trovato utile la tua domanda per qualcosa di estraneo.)
jpaugh,

Risposte:


7

Non esiste un comando che conosco che esegua la conversione, ma può essere facilmente suddiviso in pochi passaggi:

  1. Rimuovere gli indirizzi hexdumpdall'output utilizzandosed
  2. Converti in binario usando xxd
  3. La conversione endiana (ad esempio, 5a42diventa 425a) utilizzandodd

Ecco il comando completo:

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

non funziona se il hexdump termina con 0a
Smeterlink il

1

Questa risposta è un messaggio incrociato di https://stackoverflow.com/a/52834021/6770384

Puoi eseguire la conversione in un solo sedcomando. È sufficiente aggiungere l' :indirizzo dopo e modificare l'endianness (passando ab12a 12ab).

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

Bug conosciuti (vedi sezione commenti)

  • Viene aggiunto un byte null finale se il file originale era di lunghezza dispari (ad es. 1, 3, 5, 7, ..., byte lungo).
  • Le sezioni ripetute del file originale non vengono ripristinate correttamente se sono state hexdumpeditate utilizzando a  *.

non funziona se il hexdump termina con 0a
Smeterlink il

@Smeterlink Grazie per questa osservazione! Hai ragione: questo comando produce un byte null finale che non era nel file originale se la lunghezza in byte era un numero dispari. Ho anche trovato un altro bug. hexdumppuò nascondere parti ripetute usando a *. Inoltre, questo comando non può ripristinare correttamente queste parti. Esempio: yes | head -n100 | hexdump | sed -E 's/ /: /;s/ (..)(..)/ \2\1/g' | xxd -rstampa solo 8 yanziché 100. Risolvere queste cose richiederebbe più di questo one-liner. Forse aggiungerò un'altra sceneggiatura in futuro.
Socowi,

grazie per la *punta, non lo sapevo!
Smeterlink
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.