hexdump vs différence de format xxd

9

Je cherchais comment faire un vidage hexadécimal inversé et j'ai trouvé xxd mentionné. Cependant, il ne semble pas fonctionner avec simplement:

xxd -r hexdumpfile > binaryfile

J'ai ensuite comparé la différence entre les sorties de xxd infileet hexdump infile, et trouvé trois différences:

  1. La sortie xxd a deux points après l'adresse
  2. La sortie xxd a les positions dans les données inversées (par exemple, 5a42dans la sortie hexdump devient 425adans la sortie xxd)
  3. Il y a quelques caractères supplémentaires après chaque ligne

Je n'ai que la version hexdumped de certains fichiers sur un serveur. Comment puis-je récupérer correctement les données binaires en utilisant xxd?

tanon
la source
Je cherchais une option dans xxd à prendre au format hexdump, mais pour l'instant, j'ai réussi à le faire avec quelques opérations sed simples
tanon
Je n'ai pas vraiment testé précisément ce que vous demandez, mais essayez xxd -p et -b, -p est simple -b est binaire, ainsi que votre -r. Quant à l'ordre des octets, cela aurait à voir avec le gros endian et le petit endian, et peut-être que xxd ne peut pas inverser cela ... mais cela est lié à la façon dont les octets sont stockés dans le fichier. Comme si vous avez un fichier texte dans le bloc-notes , vous pouvez l'enregistrer en tant que grand endian 16 bits unicode, ou petit endian ou UTF-8 ou autre, et vous voyez la différence par rapport à xxd. La commande od peut l'afficher différemment.
barlop
Pour référence future, hexdumpvous permet de choisir l'endianité utilisée dans sa sortie, ce qui pourrait rendre cela plus simple. (Pourquoi maintenant?
J'ai

Réponses:

7

Il n'y a pas une seule commande à ma connaissance qui fera la conversion, mais elle peut facilement être divisée en quelques étapes:

  1. Supprimer les adresses de la hexdumpsortie à l'aide desed
  2. Convertir en binaire en utilisant xxd
  3. Conversion endienne (par exemple, 5a42devient 425a) en utilisantdd

Voici la commande complète:

sed 's/^[0-9]*//' hexdump | xxd -r -p | dd conv=swab of=binaryfile
Tim
la source
ne fonctionne pas si l'hexdump se termine par 0a
Smeterlink
1

Cette réponse est une publication croisée de https://stackoverflow.com/a/52834021/6770384

Vous pouvez effectuer la conversion en une seule sedcommande. Il suffit d'ajouter le :après l'adresse et de changer l'endianité (passage ab12à 12ab).

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

Bogues connus (voir la section des commentaires)

  • Un octet nul final est ajouté si le fichier d'origine était de longueur impaire (par exemple 1, 3, 5, 7, ..., long octet).
  • Les sections répétitives du fichier d'origine ne sont pas restaurées correctement si elles ont été hexdumpéditées à l'aide d'un  *.
Socowi
la source
ne fonctionne pas si l'hexdump se termine par 0a
Smeterlink
@Smeterlink Merci pour cette observation! Vous avez raison: cette commande produit un octet nul final qui n'était pas dans le fichier d'origine si la longueur en octets était un nombre impair. J'ai également trouvé un autre bug. hexdumppeut masquer des parties répétées à l'aide d'un *. Cette commande ne peut pas non plus restaurer correctement ces parties. Exemple: yes | head -n100 | hexdump | sed -E 's/ /: /;s/ (..)(..)/ \2\1/g' | xxd -rimprime seulement 8 yau lieu de 100. La réparation de ces choses nécessiterait plus que ce one-liner. Peut-être que j'ajouterai un autre script à l'avenir.
Socowi
merci pour l' *astuce, je ne savais pas!
Smeterlink