¿Hay un oneliner que convierta un archivo binario de little endian a big endian?

14

y viceversa.

Estoy ejecutando un RedHat si es relevante.

Estudiante de Fermat
fuente
66
¿Qué tipo de archivo binario?
Stéphane Chazelas
1
En cualquier caso, para cualquier formato de archivo, estoy seguro de que podría escribir una línea para convertir su endianness usando Perl y pack / unpack . Para algunos formatos, solo será una línea más larga que para otros. ;-)
Ilmari Karonen

Respuestas:

34

No puede hacer esto porque para tal conversión, necesita saber el significado del contenido binario.

Si, por ejemplo, hay una cadena dentro de un archivo binario, no debe convertirse y un entero de 4 bytes puede necesitar un tratamiento diferente que un entero de dos bytes.

En otras palabras, para una conversión de orden de bytes, necesita una descripción del tipo de datos.

astuto
fuente
77
Solo tenía que decir eso. No es tan simple como intercambiar cada par de bytes. por ejemplo, un entero de 4 bytes 01 02 03 04 en bigendian podría verse así en little endian 04 02 03 01 NOT 02 01 04 03 cs.umd.edu/class/sum2003/cmsc311/Notes/Data/endian.html
Rob
1
De acuerdo, la endianidad no tiene sentido en una secuencia de bytes sin formato ... esta debería ser la respuesta aceptada si OP no edita su pregunta
Thomas
[cita requerida] - AFAIK, a menos que una aplicación conserve explícitamente un orden de bytes y no otros, entonces es habitual que los bytes o palabras se ordenen de manera consistente.
Pausado hasta nuevo aviso.
1
@DennisWilliamson: una cadena UTF-8 o ASCII no tiene endianness. UTF-8 especifica el orden de bytes mientras que ASCII es de 7 bits y no tiene tokens de varios bytes. Una cadena UTF-16 tiene endianness y puede o no tener una lista de materiales para marcar esa endianness. Un binario de Unix destinado a interactuar con Windows o Java podría tener ambos tipos de cadena, lo que significa que debe distinguirlos al convertir.
Kevin
Vine aquí buscando un programa donde le des la descripción de los datos y los datos y los convierte. Hasta ahora no he encontrado dicho programa, pero eso no significa que no se pueda hacer.
Levi Morrison
32

Puedes intercambiar bytes con dd. ¿Es eso suficiente? De lo contrario, actualice su pregunta para dar un ejemplo de un archivo de entrada y el archivo de salida 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
fuente
2

Si no le importa el contenido del archivo y solo desea intercambiar bytes, intente con endconv . Es solo un contenedor de funciones de conversión de bytes estándar, por lo que admite la conversión de enteros largos de 2, 4 y 8 bytes. Sin embargo, no es una línea porque es un programa separado.


fuente
0

Para cambiar la capacidad de archivo, suponiendo que el tamaño de la palabra (32 bits), este 1 liner debería funcionar para usted:

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