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.

Student Fermata
źródło
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.

schily
źródło
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
roaima
źródł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.


źródło
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
hesham_EE
źródło