diferença de formato hexdump vs xxd

9

Eu estava procurando por como fazer um hexdump reverso e encontrei o xxd mencionado. No entanto, não parece funcionar simplesmente:

xxd -r hexdumpfile > binaryfile

Comparei então a diferença entre os resultados de xxd infilee hexdump infile, e encontrei três diferenças:

  1. A saída xxd possui dois pontos após o endereço
  2. A saída xxd tem as posições nos dados invertidas (por exemplo, 5a42na saída hexdump se torna a 425asaída xxd)
  3. Existem alguns caracteres extras após cada linha

Eu só tenho a versão hexdumped de certos arquivos em um servidor. Como posso recuperar corretamente os dados binários usando xxd?

tanon
fonte
Estava procurando alguma opção no xxd a tomar em formato hexdump, mas por agora, conseguiu fazê-lo com algumas operações simples sed
tanon
Não testei exatamente o que você pediu, mas tente xxd -p e -b, -p é simples -b é binário, assim como o seu -r. Quanto à ordem dos bytes, isso tem a ver com big endian e little endian, e talvez o xxd não possa reverter isso ... mas está relacionado à maneira como os bytes são armazenados no arquivo. , você pode salvá-lo como big endian unicode de 16 bits, ou little endian ou UTF-8 ou o que quer que seja, e vê a diferença em xxd. O comando od pode exibi-lo de maneira diferente.
26711 barlop
Para referência futura, hexdumppermite escolher o endianness usado em sua saída, o que poderia tornar isso mais simples. (Por que agora Encontrado sua pergunta útil para algo não relacionado?.)
jpaugh

Respostas:

7

Não há um comando que eu saiba que fará a conversão, mas ele pode ser facilmente dividido em algumas etapas:

  1. Retire os endereços da hexdumpsaída usandosed
  2. Converta em binário usando xxd
  3. Conversão endian (por exemplo, 5a42torna-se 425a) usandodd

Aqui está o comando completo:

sed 's/^[0-9]*//' hexdump | xxd -r -p | dd conv=swab of=binaryfile
Tim
fonte
não funciona se o hexdump terminar com 0a
Smeterlink
1

Esta resposta é uma postagem cruzada de https://stackoverflow.com/a/52834021/6770384

Você pode fazer a conversão em um sedcomando. É suficiente adicionar o :endereço depois e alterar a endianness (alternando ab12para 12ab).

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

Bugs conhecidos (consulte a seção de comentários)

  • Um byte nulo à direita é adicionado se o arquivo original tiver um comprimento ímpar (por exemplo, 1, 3, 5, 7, ..., byte).
  • Seções repetidas do arquivo original não serão restauradas corretamente se forem hexdumpeditadas usando a  *.
Socowi
fonte
não funciona se o hexdump terminar com 0a
Smeterlink
@Smeterlink Obrigado por esta observação! Você está certo: este comando produz um byte nulo à direita que não estava no arquivo original se o comprimento em bytes fosse um número ímpar. Eu também encontrei outro bug. hexdumppode ocultar partes repetidas usando a *. Este comando também não pode restaurar essas partes corretamente. Exemplo: yes | head -n100 | hexdump | sed -E 's/ /: /;s/ (..)(..)/ \2\1/g' | xxd -rimprime apenas 8 em yvez de 100. A correção dessas coisas exigiria mais do que essa linha única. Talvez eu adicione outro script no futuro.
Socowi 06/04
obrigado pela *dica, não sabia!
Smeterlink 6/04