Powłoka: Jak odczytać bajty pliku binarnego i wydrukować jako szesnastkowy?

Odpowiedzi:

45

Posługiwać się 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
źródło
6
Sprawdź także od. Istnieje również edytor szesnastkowy w stylu vi o nazwie hexer.
LawrenceC,
8
Bardziej podoba mi się wynik pliku „hexdump -C file”. xxd to także miłe narzędzie.
Kambus
pokaż w formacie bash hexahexdump -e '"\\\x" /1 "%02x"' filename
Aquarius Power
Dla informacji, pierwsza kolumna to szesnastkowe przesunięcie bajtów, reszta linii to 8 zestawów dwubajtowych wyświetlaczy, tj. 16 bajtów, dlatego druga linia zaczyna się od przesunięcia 10, które wynosi 16 w systemie szesnastkowym. Reprezentacja dwubajtowa zależy od endianizmu systemu. Wpisz man hexdumppełne informacje.
miguelmorin,
26

Inną opcją jest od :

od -t x1 FILE

lub

od -x FILE

od ma wiele opcji dostrajania.

nieznany użytkownik
źródło
9
od -t x1Myślę, że większość ludzi uzna to za preferowany format.
alex
Dla linii, od -t testktórą dostałemod: invalid character 't' in type string 'test'
Tom Brito
Współpracował z--t
Tomem Brito
@Tom: Może inny smak Uniksa / Linuksa? Mój od to:od --version od (GNU coreutils) 7.4
użytkownik nieznany
12

Podczas gdy jesteśmy włączone odi jeszcze hexdumpdwa podobne narzędzia:

  • hd (z bsdmainutils)
  • xxd (część Vima)

Przykładowe dane wyjściowe:

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

Lub, jeśli chcesz czytać bajty pojedynczo i drukować je we własnym formacie, spróbuj czegoś takiego:

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

Przykładowe dane wyjściowe:

7f
45
4c
46
01
01
01
00
00
00
Mikel
źródło
3
w przeciwieństwie do innych, xxd jest również w stanie cofnąć modyfikację. Dzięki temu można zmienić plik binarny za pomocą powłoki.
Offirmo
2
Twoja whilepętla nie działa dla znaków odwrotnego ukośnika i znaku nowej linii (oraz w bash (w przeciwieństwie do ksh93) dla znaków pustych), ani nie będzie działać poprawnie w ustawieniach narodowych utf8 dla bajtów z zestawem 8-bitowym. Nie potrzebujesz też „od”, możesz użyćprintf '%02x\n' "'$byte"
Stéphane Chazelas,
Uwaga: offsetjest tutaj jedynie „zmienną fikcyjną”; nie ma praktycznego zastosowania. Jest po prostu używany jako symbol zastępczy, aby się do niego dostać hex. To czasami wpływa negatywnie na czytelność read: zmienne wychodzą z niebieskiego.
składnia błąd
Być może. Ale w tym przypadku zakres $offsetjest ograniczony przez podpowłokę, więc nie widzę w tym problemu.
Mikel
4

Moje dwa centy:

tail -f streamfile | hexdump -C

Podoba mi się to, ponieważ modyfikujesz aktualnie buforowany plik, a jednocześnie widzisz zrzut heksowy na żywo. Nie zapominaj, że WSZYSTKO w Uniksie jest plikiem i możemy z łatwością łączyć polecenia, takie jak taili hexdumprozwiązywać różnorodne problemy.

MacGyverQue
źródło
przetestowane z for((i=0;i<100;i++));do echo $i >>tst2.bin;sleep 1;done&nim działa dobrze do monitorowania thx :)
Aquarius Power
3
mc 

Dowódca północy to kolejna opcja. Nie wiem, czy jest dostępny dla wszystkich smaków unixowych. Być może trzeba go najpierw pobrać.
F3 F4aby wyświetlić w wewnętrznym edytorze / w trybie szesnastkowym.

nieznany użytkownik
źródło
0

Używam od z c i x1, gdy muszę wyszukać tekst w pliku binarnym:

$ 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.
źródło