Чи є oneliner, який перетворює двійковий файл з маленького ендіана в великий ендіан?


14

і навпаки.

Я запускаю RedHat, якщо це доречно.


6
Який тип двійкового файлу?
Стефан Шазелас

1
У будь-якому випадку, для будь-якого формату файлу, я впевнений, що ви можете написати однолінійку для перетворення його витривалості за допомогою Perl та упаковки / розпакування . Для деяких форматів це буде просто довший рядок, ніж для інших. ;-)
Ілмарі Каронен

Відповіді:


34

Ви не можете цього зробити, оскільки для такого перетворення потрібно знати значення бінарного вмісту.

Якщо, наприклад, є рядок всередині двійкового файлу, він не повинен бути перетворений, а 4-байтне ціле число може потребувати іншого трактування, ніж двобайтове ціле число.

Іншими словами, для перетворення порядку байт потрібен опис типу даних.


7
Я мав це просто сказати. це не так просто, як просто поміняти кожну пару байтів. наприклад, 4 байта ціле число 01 02 03 04 в bigendian може виглядати в невеликій Endian 04 02 03 01 02 01 НЕ 04 03 cs.umd.edu/class/sum2003/cmsc311/Notes/Data/endian.html
Rob

1
Погоджено, ендіанство не має сенсу в сирому, безтиповому потоці байтів ... це має бути прийнята відповідь, якщо ОП не редагує своє запитання
Томас

[потрібне цитування] - AFAIK, якщо додаток явно не зберігає порядок байтів, а не інші, то зазвичай байти або слова послідовно впорядковуються впродовж усього.
Призупинено до подальшого повідомлення.

1
@DennisWilliamson: рядок UTF-8 або ASCII не має витривалості. UTF-8 вказує порядок байт, тоді як ASCII - 7-бітний і не має багатобайтових лексем. Рядок UTF-16 має витривалість і може мати або не мати BOM для позначення цієї ендіанності. Бінарний файл Unix, який призначений для взаємодії з Windows або Java, може мати обидва типи рядків, це означає, що ви повинні розрізняти їх при перетворенні.
Кевін

Я прийшов сюди шукати програму, де ви даєте йому опис даних і дані, і він їх перетворює. Поки що я не знайшов такої програми, але це не означає, що її неможливо зробити.
Леві Моррісон

32

Ви можете виконувати обмін bytes dd. Це достатньо? Якщо ні, будь ласка, оновіть своє запитання, щоб навести приклад вхідного файлу та очікуваного виходу.

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 . Це просто обгортка навколо стандартних функцій перетворення байтів, тому вона підтримує перетворення на 2, 4 та 8 байт довгих цілих чисел. Це не один лайнер, тому що це окрема програма.


0

Щоб змінити цілеспрямованість файлу, припускаючи розмір слова (32 біт), цей 1 вкладиш повинен працювати для вас:

hexdump -v -e '1/4 "%08x"' -e '"\n"' input_file | xxd -r -p > output_file
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.