Shell: Comment lire les octets d'un fichier binaire et imprimer en hexadécimal?

Réponses:

45

Utilisation hexdump(1)

$ hexdump -x /usr/bin/hexdump 
0000000    feca    beba    0000    0300    0001    0700    0080    0300
0000010    0000    0010    0000    5080    0000    0c00    0000    0700
0000020    0000    0300    0000    00a0    0000    b06f    0000    0c00
0000030    0000    1200    0000    0a00    0100    0010    0000    107c
0000040    0000    0c00    0000    0000    0000    0000    0000    0000
0000050    0000    0000    0000    0000    0000    0000    0000    0000

...

pdo
la source
6
Également vérifier od. Il existe également un éditeur hexadécimal de style vi appelé hexer.
LawrenceC
8
J'aime mieux la sortie de "hexdump -C file". xxd est aussi un bel outil.
Kambus
spectacle au format hexa bashhexdump -e '"\\\x" /1 "%02x"' filename
Aquarius Power
Pour information, la première colonne correspond au décalage hexadécimal des octets, le reste de la ligne correspond à 8 ensembles d’affichages sur deux octets, soit 16 octets. C’est pourquoi la deuxième ligne commence par un décalage de 1016 hexadécimal. La représentation à deux octets dépend de l’ endianité du système. Tapez man hexdumppour les détails complets.
miguelmorin
27

Une autre option est od :

od -t x1 FILE

ou

od -x FILE

od a de nombreuses options pour la mise au point.

Utilisateur inconnu
la source
9
La plupart des gens trouveraient od -t x1le format préféré, je suppose.
alex
Pour la ligne que od -t testj'ai eueod: invalid character 't' in type string 'test'
Tom Brito
Cela a fonctionné avec--t
Tom Brito
@Tom: Peut-être une autre saveur Unix / Linux? Mon od est:od --version od (GNU coreutils) 7.4
utilisateur inconnu
13

Pendant que nous sommes sur odet hexdump, deux autres outils similaires:

  • hd (de bsdmainutils)
  • xxd (partie de Vim)

Exemple de sortie:

$ hd /usr/bin/od | head
00000000  7f 45 4c 46 01 01 01 00  00 00 00 00 00 00 00 00  |.ELF............|
00000010  02 00 03 00 01 00 00 00  20 8e 04 08 34 00 00 00  |........ ...4...|
00000020  a4 a2 00 00 00 00 00 00  34 00 20 00 08 00 28 00  |........4. ...(.|
00000030  1b 00 1a 00 06 00 00 00  34 00 00 00 34 80 04 08  |........4...4...|
00000040  34 80 04 08 00 01 00 00  00 01 00 00 05 00 00 00  |4...............|
00000050  04 00 00 00 03 00 00 00  34 01 00 00 34 81 04 08  |........4...4...|
00000060  34 81 04 08 13 00 00 00  13 00 00 00 04 00 00 00  |4...............|
00000070  01 00 00 00 01 00 00 00  00 00 00 00 00 80 04 08  |................|
00000080  00 80 04 08 c4 9d 00 00  c4 9d 00 00 05 00 00 00  |................|
00000090  00 10 00 00 01 00 00 00  00 a0 00 00 00 20 05 08  |............. ..|

$ xxd /usr/bin/od | head
0000000: 7f45 4c46 0101 0100 0000 0000 0000 0000  .ELF............
0000010: 0200 0300 0100 0000 208e 0408 3400 0000  ........ ...4...
0000020: a4a2 0000 0000 0000 3400 2000 0800 2800  ........4. ...(.
0000030: 1b00 1a00 0600 0000 3400 0000 3480 0408  ........4...4...
0000040: 3480 0408 0001 0000 0001 0000 0500 0000  4...............
0000050: 0400 0000 0300 0000 3401 0000 3481 0408  ........4...4...
0000060: 3481 0408 1300 0000 1300 0000 0400 0000  4...............
0000070: 0100 0000 0100 0000 0000 0000 0080 0408  ................
0000080: 0080 0408 c49d 0000 c49d 0000 0500 0000  ................
0000090: 0010 0000 0100 0000 00a0 0000 0020 0508  ............. ..

Ou, si vous souhaitez lire les octets un par un et les imprimer dans votre propre format, essayez l'une des solutions suivantes:

while read -n 1 byte; do
    ord=$(printf "%b" "${byte:-\000}" |
          od -t x1 |
          { read offset hex; echo $hex; })
    echo "$ord"
done </usr/bin/od

Exemple de sortie:

7f
45
4c
46
01
01
01
00
00
00
Mikel
la source
3
contrairement à l'autre, xxd est également en mesure d'annuler la modification. Avec cela, il est possible de modifier un fichier binaire avec shell.
Offirmo
2
Votre whileboucle ne fonctionne pas pour les caractères de barre oblique inverse et de nouvelle ligne (et en bash (contrairement à ksh93) pour les caractères vides), elle ne fonctionnera pas correctement dans les environnements locaux utf8 pour les octets avec le 8ème bit défini. Aussi, vous n'avez pas besoin de "od", vous pouvez utiliserprintf '%02x\n' "'$byte"
Stéphane Chazelas
Note: offsetest simplement une sorte de "variable factice" ici; il n'a pas d'utilisation pratique. Il est juste utilisé comme un espace réservé pour se rendre hex. C’est ce qui affecte parfois la lisibilité de manière négative avec read: les variables sortant du bleu.
erreur de syntaxe
Peut-être. Mais dans ce cas, la portée de $offsetest limitée par le sous-shell, je ne vois donc pas cela comme un problème.
Mikel
5

Mes deux centimes:

tail -f streamfile | hexdump -C

J'aime cela parce que vous réduisez un fichier en mémoire tampon tout en pouvant voir l'hexdump en direct. N'oubliez pas que TOUT dans Unix est un fichier et que nous pouvons facilement chaîner des commandes telles que tailet hexdumppour résoudre une grande variété de problèmes.

MacGyverQue
la source
testé avec for((i=0;i<100;i++));do echo $i >>tst2.bin;sleep 1;done&cela fonctionne bien pour surveiller thx :)
Aquarius Power
4
mc 

Le commandant de minuit est une autre option. Je ne sais pas s'il est disponible pour tous les goûts Unix. Vous devrez peut-être le télécharger en premier.
F3 F4à afficher dans l'éditeur interne / en mode hexadécimal.

Utilisateur inconnu
la source
1

J'utilise od avec c et x1 lorsque je dois rechercher du texte dans le fichier binaire:

$ echo "Some text..." | od -t c -t x1
0000000   S   o   m   e       t   e   x   t   .   .   .  \n
         53  6f  6d  65  20  74  65  78  74  2e  2e  2e  0a
0000015
Sergio K
la source