Existe um oneliner que converte um arquivo binário de little endian em big endian?

14

e vice versa.

Estou executando um RedHat, se relevante.

Aluno de Fermat
fonte
6
Que tipo de arquivo binário?
Stéphane Chazelas
1
De qualquer forma, para qualquer formato de arquivo, tenho certeza de que você poderia escrever uma única linha para converter sua endianness usando Perl e empacotar / descompactar . Para alguns formatos, será apenas uma linha mais longa do que para outros. ;-)
Ilmari Karonen

Respostas:

34

Você não pode fazer isso porque, para tal conversão, precisa conhecer o significado do conteúdo binário.

Se, por exemplo, houver uma string dentro de um arquivo binário, ela não deve ser convertida e um número inteiro de 4 bytes pode precisar de tratamento diferente do número inteiro de dois bytes.

Em outras palavras, para uma conversão de ordem de bytes, você precisa de uma descrição do tipo de dados.

esperto
fonte
7
Eu era apenas para dizer isso. não é tão simples como apenas trocar cada par de bytes. por exemplo, um número inteiro de 4 bytes 01 02 03 04 no bigendian pode ter esta aparência no little endian 04 02 03 01 NÃO 02 01 04 03 cs.umd.edu/class/sum2003/cmsc311/Notes/Data/endian.html
Rob
1
Acordado, endianness não faz sentido em um cru, fluxo typeless byte ... isso deve ser a resposta aceite se OP não editar a sua pergunta
Thomas
[citation needed] - AFAIK, a menos que um aplicativo preserve explicitamente uma ordem de bytes e não outras, é comum que bytes ou palavras sejam ordenados de forma consistente.
Pausado até novo aviso.
1
@DennisWilliamson: Uma string UTF-8 ou ASCII não possui endianness. UTF-8 especifica a ordem dos bytes, enquanto o ASCII é de 7 bits e não possui tokens de vários bytes. Uma string UTF-16 possui endianness e pode ou não ter uma lista técnica para marcar esse endianness. Um binário Unix destinado a interagir com Windows ou Java pode ter os dois tipos de cadeia, o que significa que você deve distingui-los ao converter.
30715 Kevin
Eu vim aqui procurando um programa em que você dê a descrição dos dados e os dados e os converta. Até o momento, não encontrei esse programa, mas isso não significa que ele não possa ser feito.
Levi Morrison
32

Você pode byteswap com dd. Isso é suficiente? Caso contrário, atualize sua pergunta para dar um exemplo de um arquivo de entrada e o arquivo esperado.

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
fonte
2

Se você não se importa com o conteúdo do arquivo e apenas deseja trocar bytes, tente endconv . É apenas um invólucro das funções de conversão de bytes padrão, portanto, suporta a conversão por números inteiros de 2, 4 e 8 bytes. Não é um liner porque é um programa separado.


fonte
0

Para alterar a capacidade de endereçamento de arquivos, assumindo o tamanho da palavra (32 bits), este liner 1 deve funcionar para você:

hexdump -v -e '1/4 "%08x"' -e '"\n"' input_file | xxd -r -p > output_file
hesham_EE
fonte