Kabuk: İkili dosyanın baytları nasıl okunur ve onaltılık olarak yazdırılır?


Yanıtlar:


45

kullanım 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
Ayrıca kontrol edin od. Ayrıca adlandırılan vi tarzı bir hex editörü de var hexer.
LawrenceC

8
"Hexdump-C dosyasının" çıktısını daha çok seviyorum. xxd da güzel bir araçtır.
Kambus

bash hexa formatında gösterhexdump -e '"\\\x" /1 "%02x"' filename
Kova Gücü

Bilgi için, ilk sütun baytların onaltılı ofsetidir, satırın geri kalanı 8 baytlık iki baytlık ekran, yani 16 bayt'tır, bu nedenle ikinci satırın 1016'lık bir sapma ile başlaması bu nedenledir . İki baytlık gösterim , sistemin türlüğüne bağlıdır . Tip man hexdumpTüm ayrıntılar için.
miguelmorin

26

Başka bir seçenek od :

od -t x1 FILE

veya

od -x FILE

od finetuning için birçok seçeneğe sahiptir.


9
Çoğu insan od -t x1sanırım tercih edilen formatı bulur .
alex,

od -t testod: invalid character 't' in type string 'test'
Aldığım

Ile çalıştı--t
Tom Brito

@ Tom: Belki farklı bir Unix / Linux tadı? Benim odum:od --version od (GNU coreutils) 7.4
kullanıcı bilinmeyen

12

Üzerinde yaparken odve hexdumpiki tane daha benzer araçlar:

  • hd (bsdmainutils kullanıcısından)
  • xxd (Vim'in bir kısmı)

Örnek çıktı:

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

Veya, baytları birer birer okumak ve kendi formatınıza göre yazdırmak istiyorsanız, şöyle bir şey deneyin:

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

Örnek çıktı:

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

3
Diğerinin aksine, xxd de değişikliği geri alabilir. Bununla birlikte, bir ikili dosyayı kabuk ile değiştirmek mümkündür.
Offirmo

2
Kişisel whiledöngü ters eğik çizgi ve (boş karakterler için) ksh93 karşı ve bash (as) yeni satır karakterleri için çalışma yapmaz, ne de 8 bit kümesiyle bayt için utf8 yerel düzgün çalışacaktır. Ayrıca, orada "od" gerekmez, kullanabilirsinizprintf '%02x\n' "'$byte"
Stéphane Chazelas

Not: Burada offsetsadece bir çeşit "kukla değişken"; pratik bir kullanımı yoktur. Sadece almak için bir yer tutucu olarak kullanılır hex. Bu bazen okunabilirliği olumsuz yönde etkileyen şeydir read: maviden çıkan değişkenler.
sözdizimi

Belki. Ancak bu durumda, kapsamı $offsetalt kabukla sınırlıdır, bu yüzden bunu bir problem olarak görmüyorum.
Mikel

4

Benim iki Sentim:

tail -f streamfile | hexdump -C

Bunu seviyorum çünkü hexdump'ı canlı olarak görebiliyorken şu anda tamponlama dosyasını takip ediyorsunuz. Unix o ŞEY bir dosyadır ve biz zincir komutları gibi kolayca yapabilirsiniz unutma tailve hexdumpsorunlara geniş bir yelpazede çözmek için.


for((i=0;i<100;i++));do echo $i >>tst2.bin;sleep 1;done&onunla test thx izlemek için iyi çalışıyor :)
Kova Gücü

3
mc 

Gece yarısı komutanı başka bir seçenektir. Tüm unix lezzetleri için uygun olup olmadığını bilmiyorum. Önce indirmeniz gerekebilir.
F3 F4iç düzenleyicide / hex modunda görüntülemek için.


0

İkili dosya içindeki metni aramam gerektiğinde, od c ve x1 ile kullanırım:

$ 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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.