Shell: Wie liest man die Bytes einer Binärdatei und druckt sie hexadezimal?


Antworten:


45

Verwenden 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

...


6
Schau auch mal rein od. Es gibt auch einen Hex-Editor im vi-Stil hexer.
LawrenceC

8
Ich mag die Ausgabe von "hexdump -C file" besser. xxd ist auch ein schönes Werkzeug.
Kambus

show in bash hexa formathexdump -e '"\\\x" /1 "%02x"' filename
Wassermann macht

Zur Information, die erste Spalte ist der hexadezimale Versatz der Bytes, der Rest der Zeile besteht aus 8 Sätzen von Zwei-Byte-Anzeigen, dh 16 Bytes, weshalb die zweite Zeile mit einem Versatz von beginnt 10, der 16 hexadezimal ist. Die Zwei-Byte-Darstellung hängt von der Endianze des Systems ab. Geben Sie man hexdumpfür die vollständigen Details.
Miguelmorin

26

Eine andere Option ist od :

od -t x1 FILE

oder

od -x FILE

od hat viele Möglichkeiten zur Feinabstimmung.


9
od -t x1Ich denke, die meisten Leute würden das bevorzugte Format finden .
alex

Für die Linie od -t testbekam ichod: invalid character 't' in type string 'test'
Tom Brito

Es hat funktioniert mit--t
Tom Brito

@Tom: Vielleicht eine andere Unix / Linux-Variante? Meine Od ist:od --version od (GNU coreutils) 7.4
Benutzer unbekannt

12

Während wir auf odund sind hexdump, zwei ähnliche Tools:

  • hd (von bsdmainutils)
  • xxd (Teil von Vim)

Beispielausgabe:

$ 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  ............. ..

Wenn Sie die Bytes einzeln lesen und in Ihrem eigenen Format drucken möchten, versuchen Sie Folgendes:

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

Beispielausgabe:

7f
45
4c
46
01
01
01
00
00
00

3
Im Gegensatz zum anderen kann xxd die Änderung auch rückgängig machen. Damit ist es möglich, eine Binärdatei mit Shell zu ändern.
Offirmo

2
Ihre whileSchleife funktioniert nicht für Backslash- und Newline-Zeichen (und in bash (im Gegensatz zu ksh93) für Leerzeichen), und in utf8-Gebietsschemas für Bytes mit gesetztem 8. Bit funktioniert sie auch nicht ordnungsgemäß. Außerdem brauchst du dort kein "od", das kannst du benutzenprintf '%02x\n' "'$byte"
Stéphane Chazelas

Hinweis: offsetist hier nur eine Art "Dummy-Variable"; es hat keinen praktischen Nutzen. Es wird nur als Platzhalter verwendet, um dorthin zu gelangen hex. Dies wirkt sich manchmal negativ auf die Lesbarkeit aus, wenn read: Variablen aus heiterem Himmel erscheinen.
Syntaxfehler

Vielleicht. In diesem Fall ist der Umfang von $offsetjedoch durch die Unterschale begrenzt, sodass ich dies nicht als Problem sehe.
Mikel

4

Meine zwei Cent:

tail -f streamfile | hexdump -C

Ich mag das, weil Sie eine gerade gepufferte Datei verfolgen, während Sie in der Lage sind, den Hexdump live zu sehen. Vergessen Sie nicht, dass ALLES in Unix eine Datei ist und wir Befehle wie tailund leicht verketten können hexdump, um eine Vielzahl von Problemen zu lösen.


getestet mit for((i=0;i<100;i++));do echo $i >>tst2.bin;sleep 1;done&es funktioniert gut für die Überwachung von thx :)
Aquarius Power

3
mc 

Der Mitternachtskommandeur ist eine weitere Option. Ich weiß nicht, ob es für alle Unix-Varianten verfügbar ist. Möglicherweise müssen Sie es zuerst herunterladen.
F3 F4im internen Editor / im Hex-Modus anzeigen.


0

Ich benutze od mit c und x1, wenn ich nach Text in der Binärdatei suchen muss:

$ 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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.