มีโปรแกรมอรรถประโยชน์เช่น hexdump ที่จะจัดการกับ endian-ness ที่ไม่ใช่เจ้าของภาษาหรือไม่?


6

ความสามารถของ Hexdump ในการอ่านข้อมูลไบนารีและการจัดรูปแบบได้อย่างเหมาะสมเช่นสามารถ piped to awk ได้อย่างมีประโยชน์มาก แต่ฉันจำเป็นต้องอ่านไฟล์เป็นประจำซึ่งข้อมูลไบนารีเป็น endian-ness ที่แตกต่างจากระบบดั้งเดิม . โดยเฉพาะอย่างยิ่งฉันต้องอ่านข้อมูลขนาดใหญ่ในเครื่องเล็ก ๆ ของ endian ทางออกที่ดีที่สุดของฉันคือ "hexdump" พร้อมสวิตช์เพื่อสลับ endian-ness แต่ดูเหมือนว่าสวิตช์จะไม่มีอยู่จริง

มีวิธีแก้ปัญหา "ถัดไปดีที่สุด" ที่ดีสำหรับปัญหานี้หรือไม่?


นี่อาจไม่ได้อยู่ในหัวข้อที่ผู้ใช้ขั้นสูงและควรจะอยู่ในUnix & Linuxโปรดอ่านคำตอบของฉันแม้ว่าจะเป็นวิธีที่ดีกว่าที่เลือกไว้
Evan Carroll

คำตอบ:


3

มีโปรแกรมอรรถประโยชน์เช่น hexdump ที่จะจัดการกับ endian-ness ที่ไม่ใช่เจ้าของภาษาหรือไม่?

ใช่โปรแกรมอรรถประโยชน์นี้เรียกว่า Perl

ดีจริงข้อมูล :: HexDumper - แม้ว่าคุณอาจจะม้วนของคุณเอง

number_format
สตริงที่ระบุวิธีจัดรูปแบบข้อมูล มันสามารถเป็นอย่างใดอย่างหนึ่งต่อไปนี้
ซึ่งคุณจะสังเกตได้ว่ามีความหมายเหมือนกับที่ทำกับฟังก์ชันแพ็คของ perl:

C - ถ่านไม่ได้ลงนาม
S - endianness ดั้งเดิมแบบ 16 บิต
v หรือ S <- 16 บิตที่ไม่ได้ลงชื่อ, little-endian
n หรือ S> - 16-bit ที่ไม่ได้ลงชื่อซึ่งเป็น big-endian
L - endianness ดั้งเดิมแบบ 32 บิต
V หรือ L <- แบบ 32 บิตที่ไม่ได้ลงนาม, little-endian
N หรือ L> - แบบ 32 บิตที่มีผู้ลงนามใหญ่
Q - endianness แบบ 64 บิตที่ไม่ได้ลงชื่อ
Q <- แบบ 64 บิตที่ไม่ได้ลงชื่อ
Q> - 64 บิตที่ไม่ได้ลงนามใหญ่

ฉันไม่ได้มีความสุขจริงๆที่ต้องพึ่งพา Perl และต้องพิมพ์ตัวอักษรพิเศษ (เป็นที่ยอมรับมาก) เมื่อเทียบกับ hexdump แต่เชื่อว่าไม่มีตัวเลือกที่ดีกว่า
EHN

4

อย่างน้อยสำหรับคำที่มีขนาด 16 บิตก็สามารถใส่เข้าไปได้dd conv=swabเหมือนใน

cat file.dat | dd conv=swab | od -t x2

1

ตามที่pixelbeatแนะนำคุณสามารถใช้objcopy :

$ objcopy -I binary -O binary --reverse-bytes=num inputfile.bin outputfile.bin

โดยที่num2 สำหรับคำ 16 บิต 4 สำหรับ 32 บิตคำและ 8 สำหรับ 64 บิตคำ

ขออภัย objcopy ไม่มีตัวเลือกในการรับอินพุตจากstdinหรือเขียนเอาต์พุตไปยังstdoutดังนั้นเพื่อใช้เป็นไพพ์คุณจะต้องเขียนสคริปต์ wrapper ที่สร้างไฟล์ชั่วคราว

คำตอบนี้จะถูกคัดลอกจากhttps://stackoverflow.com/a/19288235/1979048และจากhttps://serverfault.com/a/329207/157443


1

เพียงใช้od(8.23 หรือมากกว่า) เป็นส่วนหนึ่งของฐานมาตรฐาน Linux และในความคิดของฉันดีกว่าhexdumpทุกอย่าง มันมีendianตัวเลือก

‘--endian=order’
Reorder input bytes, to handle inputs with differing byte orders, or to provide consistent output independent of the endian convention of the current system. Swapping is performed according to the specified --type size and endian order, which can be ‘little’ or ‘big’.

คุณสามารถใช้มันแบบนี้

od --endian big -x

แพทช์เพื่อเพิ่มสิ่งนี้ได้รับการยอมรับในปี 2014


1
od ไม่มีตัวเลือก --endian ในระบบใด ๆ ที่ฉันใช้ (GNU coreutils 8.22 หรือ OS X 10.11.6)
EHN

1
@EHN มันมีความมุ่งมั่นใน 8.23 ​​ซึ่งเป็นในปี 2014 คำถามที่ปรับปรุงเพื่อสะท้อนให้เห็นว่า
Evan Carroll

0

dd conv = swab <file.dat | hexdump


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