Есть ли oneliner, который преобразует двоичный файл с прямым порядком байтов?

14

и наоборот.

Я использую RedHat, если уместно.

Студент Ферма
источник
6
Какой тип двоичного файла?
Стефан Шазелас
1
В любом случае, для любого формата файла, я уверен, что вы могли бы написать однострочник, чтобы преобразовать его порядковый номер, используя Perl и pack / unpack . Для некоторых форматов это будет просто более длинная строка, чем для других. ;-)
Илмари Каронен

Ответы:

34

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

Если, например, в двоичном файле есть строка, ее нельзя преобразовывать, и 4-байтовое целое может потребовать иной обработки, чем двухбайтовое целое.

Другими словами, для преобразования порядка байтов необходимо описание типа данных.

Шили
источник
7
Я просто хотел сказать это. это не так просто, как просто поменять местами каждую пару байтов. например, 4-байтовое целое число 01 02 03 04 в bigendian может выглядеть следующим образом: little-endian 04 02 03 01 NOT 02 01 04 03 cs.umd.edu/class/sum2003/cmsc311/Notes/Data/endian.html
Rob
1
Согласен, в необработанном потоке байтов не имеет смысла порядка байтов ... это должен быть принятый ответ, если OP не редактирует свой вопрос
Томас
[требуется цитата] - AFAIK, если приложение явно не сохраняет некоторый порядок байтов, а не другие, то обычно байты или слова последовательно упорядочены по всему.
Приостановлено до дальнейшего уведомления.
1
@DennisWilliamson: строка UTF-8 или ASCII не имеет порядкового номера. UTF-8 определяет порядок байтов, тогда как ASCII является 7-битным и не имеет многобайтовых токенов. Строка UTF-16 имеет порядковый номер и может иметь или не иметь спецификацию для обозначения этого порядкового номера. Двоичный файл Unix, предназначенный для взаимодействия с Windows или Java, может иметь оба типа строк, что означает, что вы должны различать их при преобразовании.
Кевин
Я пришел сюда в поисках программы, в которой вы даете ей описание данных и данные, и он преобразует их. До сих пор я не нашел такой программы, но это не значит, что это невозможно сделать.
Леви Моррисон
32

Вы можете поменять байты с 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
roaima
источник
2

Если вы не заботитесь о содержимом файла и просто хотите поменять местами байты, попробуйте endconv . Это просто оболочка вокруг стандартных функций преобразования байтов, поэтому она поддерживает преобразование в целые числа длиной 2, 4 и 8 байтов. Это не один лайнер, потому что это отдельная программа.


источник
0

Чтобы изменить порядковый номер файла, предполагая размер слова (32-разрядный), этот 1 вкладыш должен работать для вас:

hexdump -v -e '1/4 "%08x"' -e '"\n"' input_file | xxd -r -p > output_file
hesham_EE
источник