Czy istnieje program oneliner, który konwertuje plik binarny z małego endiana na duży endian?


14

i wzajemnie.

W razie potrzeby korzystam z RedHata.


6
Jaki typ pliku binarnego?
— Stéphane Chazelas

1
W każdym razie, dla każdego formatu pliku, jestem pewien, że możesz napisać jeden wiersz, aby przekonwertować jego endianność za pomocą Perla i spakuj / rozpakuj . W przypadku niektórych formatów będzie to po prostu dłuższa linia niż w przypadku innych formatów. ;-)
— Ilmari Karonen

Odpowiedzi:


34

Nie możesz tego zrobić, ponieważ do takiej konwersji musisz znać znaczenie treści binarnej.

Jeśli np. W pliku binarnym znajduje się ciąg, nie można go przekonwertować, a 4-bajtowa liczba całkowita może wymagać innego traktowania niż dwubajtowa liczba całkowita.

Innymi słowy, do konwersji kolejności bajtów potrzebny jest opis typu danych.


7
Miałem tylko to powiedzieć. nie jest to tak proste, jak zamiana każdej pary bajtów. na przykład 4 bajtowa liczba całkowita 01 02 03 04 w bigendianie może wyglądać tak w małej endianie 04 02 03 01 NOT 02 01 04 03 cs.umd.edu/class/sum2003/cmsc311/Notes/Data/endian.html
— Rob

1
Zgadzam się, endianizm nie ma sensu w surowym, pozbawionym typów strumieniu bajtów ... to powinna być zaakceptowana odpowiedź, jeśli OP nie edytuje swojego pytania
— Thomas

[potrzebne źródło] - AFAIK, chyba że aplikacja jednoznacznie zachowuje pewną kolejność bajtów, a nie inne, to zwykle bajty lub słowa są uporządkowane konsekwentnie przez cały czas.
— Wstrzymano do odwołania.

1
@DennisWilliamson: Ciąg UTF-8 lub ASCII nie ma endianizmu. UTF-8 określa kolejność bajtów, podczas gdy ASCII jest 7-bitowy i nie ma tokenów wielobajtowych. Łańcuch UTF-16 ma endianowość i może mieć lub nie BOM do oznaczenia tej endianizmu. Plik binarny uniksowy, który ma wchodzić w interakcje z systemem Windows lub Javą, może zawierać oba typy ciągów, co oznacza, że ​​musisz je rozróżnić podczas konwersji.
— Kevin

Przybyłem tutaj, szukając programu, w którym podajesz opis danych i dane, a on je konwertuje. Do tej pory nie znalazłem takiego programu, ale to nie znaczy, że nie można tego zrobić.
— Levi Morrison,

32

Możesz zamieniać bajtami za pomocą dd. Czy to wystarczy? Jeśli nie, zaktualizuj swoje pytanie, podając przykładowy plik wejściowy i oczekiwany plik wyjściowy.

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

Jeśli nie obchodzi Cię zawartość pliku i po prostu chcesz zamienić bajty, spróbuj endconv . Jest to tylko opakowanie wokół standardowych funkcji konwersji bajtów, więc obsługuje konwersję liczb całkowitych o długości 2, 4 i 8 bajtów. Nie jest to jednak jedna linijka, ponieważ jest to osobny program.


0

Aby zmienić endianizm pliku, przy założeniu rozmiaru słowa (32-bitowego), ten 1 linijka powinien działać dla Ciebie:

hexdump -v -e '1/4 "%08x"' -e '"\n"' input_file | xxd -r -p > output_file
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.