วิธีสร้าง hex dump ของไฟล์ที่บรรจุเฉพาะตัว hex โดยไม่มีช่องว่างใน bash?


188

ฉันจะสร้างฐานข้อมูลเลขฐานสิบหกที่ไม่ได้แก้ไขของไฟล์ไบนารีใน Linux โดยใช้ bash ได้อย่างไร odและhexdumpคำสั่งทั้งช่องว่างแทรกในการถ่ายโอนข้อมูลและนี่คือไม่เหมาะ

มีวิธีการเขียนสตริงยาว ๆ ที่มีอักขระฐานสิบหกทั้งหมดลบช่องว่างหรือขึ้นบรรทัดใหม่ในผลลัพธ์หรือไม่


คำตอบ:


250

xxd -p file

หรือถ้าคุณต้องการมันทั้งหมดในบรรทัดเดียว:

xxd -p file | tr -d '\n'


13
fyi หากต้องการย้อนกลับกระบวนการ: ไฟล์ xxd -r -ps hexascii.txt (ไม่เป็นไรมีหรือไม่มีบรรทัดใหม่)
Curtis Yallop

92

สตริงรูปแบบสามารถทำให้ hexdump ทำงานได้ตามที่คุณต้องการ (ไม่มีช่องว่างเลยไบต์ต่อไบต์):

hexdump -ve '1/1 "%.2x"'

1/1หมายถึง "แต่ละรูปแบบถูกนำมาใช้เพียงครั้งเดียวและใช้เวลาหนึ่งไบต์" และ"%.2x"เป็นสตริงรูปแบบที่แท้จริงเช่นใน printf ในกรณีนี้: เลขฐานสิบหก 2 ตัวอักษรนำศูนย์ถ้าสั้นกว่า


7
คุณต้องการ-vหรือมันจะลดลงซ้ำไบต์และแทนที่ด้วยเครื่องหมายดอกจัน
หยุดชั่วคราวจนกว่าจะมีการแจ้งให้ทราบต่อไป

2
ฉันสงสัยว่า hexdump เองสามารถต่อท้ายบรรทัดใหม่ (เท่านั้น) ต่อท้ายเอาต์พุต .. (ภาคผนวกที่ชัดเจน; echoทำให้ไม่สามารถใช้เป็นนามแฝงทุบตีได้)
mykhal

2
นามแฝงของฉัน:alias to_hex="hexdump -ve '1/1 \"%.2x\"' && echo"
devstuff

การนับซ้ำและนับไบต์เริ่มต้นเป็นหนึ่งดังนั้น 1/1 อาจถูกละเว้นออกhexdump -ve '"%.2x"'
Alex Che

@mykhal เป็นไปได้ถ้าคุณรู้จำนวนไบต์ในการส่งออก พูดว่าถ้าคุณใช้ hexdump เพื่อส่งออกเพียง 13 ไบต์แรก:hexdump -n 13 -e '13/1 "%.2x" "\n"'
อเล็กซ์ Che

24

odมันน่าจะขึ้นอยู่กับรายละเอียดของรุ่นของ บน OSX ให้ใช้สิ่งนี้:

od -t x1 -An file |tr -d '\n '

(นั่นคือพิมพ์เป็นไบต์ฐานสิบหกประเภทที่ไม่มีที่อยู่และช่องว่างที่ถูกลบหลังจากนั้นแน่นอน)


1
ฉันยังจะเพิ่มในบริบทนี้มิฉะนั้นจะข้ามซ้ำกับ-v *
Ciro Santilli 郝海东冠状病六四事件法轮功

10

Perl หนึ่งซับ:

perl -e 'local $/; print unpack "H*", <>' file

ตรวจสอบแล้ว ตรงกับ "xxd -p ไฟล์ | tr -d '\ n'"
เคอร์ติส Yallop

1
fyi เพื่อย้อนกลับกระบวนการ: perl -e 'local $ /; ชุดการพิมพ์ "H *", <> '<hexascii.txt> ไฟล์
Curtis Yallop

"local $ /" ไม่จำเป็น
Curtis Yallop

อัปเดตเป็นความคิดเห็นล่าสุด: "local $ /" ไม่จำเป็นสำหรับ "pack" สำหรับการแกะคุณต้องใช้ แต่สามารถใส่ "undef $ /" $ / เป็นตัวคั่นบรรทัด (ค่าเริ่มต้น NL) ไม่ได้กำหนดทำให้มันเข้าสู่โหมด slurp ดังนั้น <> การอ้างอิงในบริบทของสตริงจะดึงไฟล์ไบนารีทั้งหมดโดยไม่แยกวิเคราะห์ลงในบรรทัด
เคอร์ติส Yallop

รูปแบบอื่น: perl -e 'พิมพ์ unpack "H *", เข้าร่วม ("", <>)' <ไฟล์
Curtis Yallop

2

คำตอบอื่น ๆ จะดีกว่า แต่สำหรับโซลูชันทุบตีบริสุทธิ์ฉันได้แก้ไขสคริปต์ในคำตอบของฉันที่นี่เพื่อให้สามารถส่งออกกระแสของอักขระฐานสิบหกอย่างต่อเนื่องแทนเนื้อหาของไฟล์ (โหมดปกติคือเลียนแบบhexdump -C)

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