ความแตกต่างของรูปแบบ hexdump vs xxd


9

ฉันกำลังค้นหาวิธีการทำ hexdump ย้อนกลับและพบ xxd ที่กล่าวถึง อย่างไรก็ตามดูเหมือนว่าจะใช้งานไม่ได้กับ:

xxd -r hexdumpfile > binaryfile

ฉันเปรียบเทียบความแตกต่างระหว่างผลลัพธ์ของxxd infileและhexdump infileและพบความแตกต่างสามประการ:

  1. เอาต์พุต xxd มีโคลอนหลังจากที่อยู่
  2. เอาต์พุต xxd มีตำแหน่งในข้อมูลย้อนกลับ (ตัวอย่างเช่น5a42ในเอาต์พุต hexdump จะกลายเป็น425aเอาต์พุต xxd)
  3. มีอักขระพิเศษบางตัวหลังจากแต่ละบรรทัด

ฉันมีไฟล์บางไฟล์ในเซิร์ฟเวอร์เท่านั้น ฉันจะรับข้อมูลไบนารีกลับมาอย่างถูกต้องโดยใช้ xxd ได้อย่างไร?


กำลังมองหาตัวเลือกบางอย่างใน xxd ที่จะใช้ในรูปแบบ hexdump แต่ตอนนี้มีการจัดการที่จะทำมันมีการดำเนินงานที่เรียบง่าย sed บาง
tanon

ฉันไม่ได้ทดสอบสิ่งที่คุณถามจริงๆ แต่ลอง xxd -p และ -b, -p เป็นธรรมดา -b เป็นไบนารี่เช่นเดียวกับ -r ของคุณ ตามลำดับไบต์นั้นจะทำกับ endian ใหญ่และ endian น้อยและอาจ xxd ไม่สามารถย้อนกลับที่ .. แต่มันเกี่ยวข้องกับวิธีการเก็บไบต์ในไฟล์เหมือนถ้าคุณมีไฟล์ข้อความใน Notepad คุณสามารถบันทึกเป็น unicode big-bit 16-endian หรือ endian น้อยหรือ UTF-8 หรืออะไรก็ได้และคุณเห็นความแตกต่างจาก xxd คำสั่ง od อาจแสดงแตกต่างกัน
barlop

สำหรับการอ้างอิงในอนาคตhexdumpช่วยให้คุณสามารถเลือก endianness ที่ใช้ในผลลัพธ์ซึ่งอาจทำให้ง่ายขึ้น (ทำไมตอนนี้พบว่าคำถามของคุณมีประโยชน์สำหรับบางสิ่งที่ไม่เกี่ยวข้อง)
jpaugh

คำตอบ:


7

ไม่มีคำสั่งเดียวที่ฉันรู้ว่าจะทำการแปลง แต่มันสามารถแบ่งออกเป็นไม่กี่ขั้นตอน:

  1. สตริปแอดเดรสจากhexdumpเอาต์พุตโดยใช้sed
  2. แปลงเป็นเลขฐานสองโดยใช้ xxd
  3. การแปลง Endian (เช่น5a42กลายเป็น425a) ใช้dd

นี่คือคำสั่งทั้งหมด:

sed 's/^[0-9]*//' hexdump | xxd -r -p | dd conv=swab of=binaryfile

ไม่ทำงานหาก hexdump ลงท้ายด้วย 0a
Smeterlink

1

คำตอบนี้เป็น cross-post จากhttps://stackoverflow.com/a/52834021/6770384

คุณสามารถทำการแปลงในsedคำสั่งเดียว การเพิ่มที่อยู่:หลังและเปลี่ยน endianness (เปลี่ยนab12เป็น12ab) ก็เพียงพอแล้ว

sed -E 's/ /: /;s/ (..)(..)/ \2\1/g;$d' dump | xxd -r

บักที่รู้จัก (ดูหัวข้อความคิดเห็น)

  • ไบต์ null ต่อท้ายจะถูกเพิ่มหากไฟล์ต้นฉบับมีความยาวคี่ (เช่น 1, 3, 5, 7, ... , ไบต์ยาว)
  • การทำซ้ำในส่วนของไฟล์ต้นฉบับจะไม่ได้รับการบูรณะอย่างถูกต้องถ้าพวกเขาถูกhexdumped *ใช้

ไม่ทำงานหาก hexdump ลงท้ายด้วย 0a
Smeterlink

@Smeterlink ขอบคุณสำหรับการสังเกตครั้งนี้! คุณพูดถูก: คำสั่งนี้สร้างไบต์ว่างท้ายซึ่งไม่ได้อยู่ในไฟล์ต้นฉบับหากความยาวเป็นไบต์เป็นเลขคี่ ฉันยังพบข้อผิดพลาดอื่น อาจซ่อนชิ้นส่วนที่ใช้ซ้ำแล้วซ้ำอีกhexdump *คำสั่งนี้ยังไม่สามารถกู้คืนชิ้นส่วนเหล่านี้ได้อย่างถูกต้อง ตัวอย่าง: yes | head -n100 | hexdump | sed -E 's/ /: /;s/ (..)(..)/ \2\1/g' | xxd -rพิมพ์เพียง 8 yแทนที่จะเป็น 100 การแก้ไขสิ่งเหล่านี้จะต้องใช้มากกว่าหนึ่งซับ บางทีฉันอาจเพิ่มสคริปต์อื่นในอนาคต
Socowi

ขอบคุณสำหรับคำ*แนะนำไม่รู้!
Smeterlink
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.