Чи є 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.