มี oneliner ที่แปลงไฟล์ไบนารีจาก endian น้อยไปเป็น endian ใหญ่หรือไม่?


14

และในทางกลับกัน.

ฉันใช้ RedHat ถ้าเกี่ยวข้อง


6
ไฟล์ไบนารีประเภทใด
Stéphane Chazelas

1
ในกรณีใด ๆ สำหรับรูปแบบไฟล์ใด ๆ ฉันแน่ใจว่าคุณสามารถเขียนหนึ่งซับการแปลง endianness ของการใช้ Perl และแพ็ค / แกะ สำหรับบางรูปแบบมันจะเป็นบรรทัดที่ยาวกว่าสำหรับรูปแบบอื่น ๆ ;-)
Ilmari Karonen

คำตอบ:


34

คุณไม่สามารถทำเช่นนี้เพราะสำหรับการแปลงดังกล่าวคุณจำเป็นต้องรู้ความหมายของเนื้อหาไบนารี

หากเช่นมีสตริงอยู่ในไฟล์ไบนารีจะต้องไม่ถูกแปลงและจำนวนเต็ม 4 ไบต์อาจต้องใช้วิธีที่แตกต่างจากจำนวนเต็มสองไบต์

กล่าวอีกนัยหนึ่งสำหรับการแปลงคำสั่งแบบไบต์คุณต้องการคำอธิบายชนิดข้อมูล


7
ฉันแค่พูดแบบนั้น มันไม่ง่ายอย่างการแลกเปลี่ยนไบต์ทุกคู่ เช่นจำนวนเต็ม 4 ไบต์ 01 02 03 04 ใน bigendian อาจมีลักษณะเช่นนี้ใน little endian 04 02 03 01 ไม่ 02 01 04 03 cs.umd.edu/class/sum2003/cmsc311/Notes/Data/endian.html
Rob

1
ตกลง endianness ทำให้รู้สึกไม่ถึงกับดิบ byte กระแสพิมพ์ ... นี้ควรเป็นคำตอบที่ยอมรับถ้า OP ไม่ได้แก้ไขคำถามของเขา
Thomas

[อ้างอิงที่จำเป็น] - AFAIK ยกเว้นว่าแอปพลิเคชันจะเก็บรักษาคำสั่งไบต์ไว้อย่างชัดเจนและไม่ใช่แอปพลิเคชันอื่น ๆ ดังนั้นจึงเป็นเรื่องปกติที่ไบต์หรือคำที่จะต้องสั่งอย่างสม่ำเสมอตลอด
หยุดชั่วคราวจนกว่าจะมีการแจ้งให้ทราบต่อไป

1
@DennisWilliamson: สตริง UTF-8 หรือ ASCII ไม่มีความสมบูรณ์ UTF-8 ระบุลำดับไบต์ในขณะที่ ASCII คือ 7 บิตและไม่มีโทเค็นหลายไบต์ สตริง UTF-16 มีความเป็น endianness และอาจมีหรือไม่มี BOM เพื่อทำเครื่องหมาย endianness นั้น ไบนารี Unix ซึ่งมีจุดประสงค์เพื่อโต้ตอบกับ Windows หรือ Java อาจมีสตริงทั้งสองประเภทซึ่งหมายความว่าคุณต้องแยกแยะความแตกต่างเมื่อทำการแปลง
เควิน

ฉันมาที่นี่เพื่อค้นหาโปรแกรมที่คุณให้คำอธิบายข้อมูลและข้อมูลและแปลงให้ จนถึงตอนนี้ฉันยังไม่พบโปรแกรมดังกล่าว แต่นั่นไม่ได้หมายความว่ามันไม่สามารถทำได้
Levi Morrison

32

คุณสามารถ byteswap ddกับ พอเพียงหรือไม่ หากไม่มีโปรดอัปเดตคำถามของคุณเพื่อให้ตัวอย่างไฟล์อินพุตและไฟล์ outfile ที่คาดหวัง

echo hello >infile
dd conv=swab <infile >outfile

hex infile
   0000 68 65 6c 6c 6f 0a                                 hello.
hex outfile
   0000 65 68 6c 6c 0a 6f                                 ehll.o

2

หากคุณไม่สนใจเกี่ยวกับเนื้อหาของแฟ้มและเพียงแค่ต้องการไบต์แลกเปลี่ยนแล้วลองendconv มันเป็นเพียง wrapper รอบฟังก์ชั่นการแปลงไบต์มาตรฐานดังนั้นจึงรองรับการแปลงด้วยจำนวนเต็มยาว 2, 4 และ 8 ไบต์ ไม่ใช่สายการบินเดียวเนื่องจากเป็นโปรแกรมแยกต่างหาก


0

ในการเปลี่ยนไฟล์ endianess โดยสมมติว่าขนาด word (32- บิต) ไลเนอร์ 1 อันนี้น่าจะเหมาะกับคุณ:

hexdump -v -e '1/4 "%08x"' -e '"\n"' input_file | xxd -r -p > output_file
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.