Có một oneliner chuyển đổi một tập tin nhị phân từ endian nhỏ sang endian lớn?


14

và ngược lại.

Tôi đang chạy RedHat nếu có liên quan.


6
Loại tệp nhị phân nào?
Stéphane Chazelas

1
Trong mọi trường hợp, đối với bất kỳ định dạng tệp nào, tôi chắc chắn rằng bạn có thể viết một lớp lót để chuyển đổi độ bền của nó bằng cách sử dụng Perl và đóng gói / giải nén . Đối với một số định dạng, nó sẽ chỉ là một dòng dài hơn so với các định dạng khác. ;-)
Ilmari Karonen

Câu trả lời:


34

Bạn không thể làm điều này bởi vì để chuyển đổi như vậy, bạn cần biết ý nghĩa của nội dung nhị phân.

Nếu ví dụ: có một chuỗi bên trong tệp nhị phân thì không được chuyển đổi và số nguyên 4 byte có thể cần xử lý khác với số nguyên hai byte.

Nói cách khác, để chuyển đổi thứ tự byte, bạn cần mô tả kiểu dữ liệu.


7
Tôi chỉ muốn nói rằng. nó không đơn giản như việc hoán đổi mỗi cặp byte. ví dụ: số nguyên 4 byte 01 02 03 04 trong bigendian có thể trông như thế này trong endian nhỏ 04 02 03 01 KHÔNG 02 01 04 03 cs.umd.edu/ class / sum2003 / cmsc311 / Nike / Data / endian.html
Rob

1
Đồng ý, endianness không có ý nghĩa gì đối với luồng byte thô, không chữ ... đây sẽ là câu trả lời được chấp nhận nếu OP không chỉnh sửa câu hỏi của anh ấy
Thomas

[cần dẫn nguồn] - AFAIK, trừ khi một ứng dụng bảo toàn rõ ràng một số thứ tự byte và không phải thứ tự khác, thì thông thường các byte hoặc từ phải được sắp xếp một cách nhất quán trong suốt.
Tạm dừng cho đến khi có thông báo mới.

1
@DennisWilliamson: Chuỗi UTF-8 hoặc ASCII không có tuổi thọ. UTF-8 chỉ định thứ tự byte trong khi ASCII là 7 bit và không có mã thông báo nhiều byte. Một chuỗi UTF-16 không có tuổi thọ và có thể có hoặc không có BOM để đánh dấu sự tồn tại đó. Một nhị phân Unix được dự định tương tác với Windows hoặc Java có thể có cả hai loại chuỗi, có nghĩa là bạn phải phân biệt chúng khi chuyển đổi.
Kevin

Tôi đến đây để tìm kiếm một chương trình nơi bạn cung cấp cho nó mô tả dữ liệu và dữ liệu và nó chuyển đổi nó. Cho đến nay tôi không tìm thấy một chương trình như vậy nhưng điều đó không có nghĩa là nó không thể được thực hiện.
Levi Morrison

32

Bạn có thể bytewap với dd. Đó có phải là đủ? Nếu không, vui lòng cập nhật câu hỏi của bạn để đưa ra ví dụ về tệp đầu vào và tệp tin dự kiến.

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

Nếu bạn không quan tâm đến nội dung tệp và chỉ muốn trao đổi byte, hãy thử endconv . Nó chỉ là một trình bao bọc xung quanh các hàm chuyển đổi byte tiêu chuẩn, vì vậy nó hỗ trợ chuyển đổi theo các số nguyên dài 2, 4 và 8 byte. Đây không phải là một lớp lót vì nó là chương trình riêng biệt.


0

Để thay đổi endianess tệp, giả sử kích thước từ (32-bit), 1 lớp lót này sẽ phù hợp với bạn:

hexdump -v -e '1/4 "%08x"' -e '"\n"' input_file | xxd -r -p > output_file
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.