ในเชลล์ฉันจะอ่านไบต์ของไฟล์ไบนารีที่ฉันมีและพิมพ์เอาต์พุตเป็นตัวเลขฐานสิบหกได้อย่างไร
ในเชลล์ฉันจะอ่านไบต์ของไฟล์ไบนารีที่ฉันมีและพิมพ์เอาต์พุตเป็นตัวเลขฐานสิบหกได้อย่างไร
คำตอบ:
ใช้ 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
...
od
ยังตรวจสอบ นอกจากนี้ยังมีแก้ไข hex vi hexer
สไตล์ที่เรียกว่า
hexdump -e '"\\\x" /1 "%02x"' filename
10
ซึ่งคือ 16 ในฐานสิบหก การแทนค่าสองไบต์ขึ้นอยู่กับendiannessของระบบ พิมพ์man hexdump
รายละเอียดทั้งหมด
od -t x1
เป็นรูปแบบที่ต้องการฉันเดา
od -t test
ฉันได้รับod: invalid character 't' in type string 'test'
--t
od --version od (GNU coreutils) 7.4
ขณะที่เราเปิดod
และhexdump
เครื่องมือที่คล้ายกันอีกสองอย่าง:
ตัวอย่างผลลัพธ์:
$ 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 ............. ..
หรือหากคุณต้องการอ่านไบต์ทีละรายการและพิมพ์ในรูปแบบของคุณเองลองทำดังนี้:
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
ตัวอย่างผลลัพธ์:
7f
45
4c
46
01
01
01
00
00
00
while
ลูปของคุณใช้ไม่ได้กับแบ็กสแลชและอักขระขึ้นบรรทัดใหม่ (และในแบ็ช (ตรงข้ามกับ ksh93) สำหรับอักขระว่าง) และจะไม่ทำงานอย่างถูกต้องในโลแคล utf8 สำหรับไบต์ด้วยชุดบิตที่ 8 นอกจากนี้คุณไม่จำเป็นต้อง "od" ที่นั่นคุณสามารถใช้printf '%02x\n' "'$byte"
offset
เป็นเพียงแค่ "ตัวแปรจำลอง" ที่นี่; มันไม่มีประโยชน์ในทางปฏิบัติ hex
มันถูกใช้เพียงแค่เป็นตัวยึดตำแหน่งที่จะได้รับไป นี่คือสิ่งที่บางครั้งส่งผลกระทบต่อความสามารถในการอ่านในทางลบด้วยread
: ตัวแปรที่มาจากสีน้ำเงิน
$offset
ถูก จำกัด โดยเชลล์ย่อยดังนั้นฉันจึงไม่เห็นว่าเป็นปัญหา
สองเซ็นต์ของฉัน:
tail -f streamfile | hexdump -C
ฉันชอบสิ่งนี้เพราะคุณกำลังปรับไฟล์บัฟเฟอร์ในขณะที่สามารถดู hexdump live ได้ อย่าลืมว่าทุกอย่างใน Unix เป็นไฟล์และเราสามารถเชื่อมโยงคำสั่งต่าง ๆ เช่นเดียวกับtail
และhexdump
เพื่อแก้ไขปัญหาที่หลากหลาย
for((i=0;i<100;i++));do echo $i >>tst2.bin;sleep 1;done&
มันใช้งานได้ดีสำหรับการตรวจสอบขอบคุณ :)
mc
ผู้บัญชาการเที่ยงคืนเป็นอีกทางเลือกหนึ่ง ฉันไม่รู้ว่ามันใช้ได้กับทุกรสชาติของยูนิกซ์หรือไม่ คุณอาจต้องดาวน์โหลดก่อน
F3 F4เพื่อดูในเครื่องมือแก้ไขภายใน / ในโหมด hex
ฉันใช้ od กับ c และ x1 เมื่อฉันต้องการค้นหาข้อความในไฟล์ไบนารี:
$ 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