Pregunta

Esta no es una pregunta específica de ningún lenguaje de programación. Digamos que tiene algún archivo escrito en una máquina big-endian, y lo sabe. Si dos valores de un solo byte se escribieran consecutivamente, ¿cómo lo sabrías? Big-endian invierte el orden de los valores de 16, 32 y 64 bits, entonces, ¿cómo podría saber que necesita leerlo como bytes individuales?

Por ejemplo, escribe el byte 0x11, luego el byte 0x22. El archivo contiene 0x1122. Si lo lees en una pequeña máquina endian, deberías convertirlo. Entonces, ¿lo leerías como 2211 o 1122? ¿Sabrías cómo?

¿Tiene esto algún sentido? Siento que me falta algo súper básico aquí.

¿Fue útil?

Solución

No hay forma de saberlo. Esta es la razón por la cual los formatos de archivo especificados formalmente generalmente exigen una resistencia, o proporcionan una opción (como con Unicode, como se menciona en MSN). De esta manera, si está leyendo un archivo con un formato particular, sabe que ya es big-endian, porque el hecho de que esté en ese formato implica una endianness particular.

Otro buen ejemplo de esto es orden de bytes de red - los protocolos de red son típicamente big-endian, así que si eres un procesador little-endian que habla por internet, debes escribir las cosas al revés. Si eres big endian, no necesitas preocuparte por eso. Las personas usan funciones como htonl y ntohl para preprocesar las cosas que escriben en el red para que su código fuente sea el mismo en todas las máquinas. Estas funciones están definidas para no hacer nada en máquinas big-endian, pero cambian bytes en máquinas little-endian.

La comprensión clave es que la endianidad es una propiedad de cómo las arquitecturas particulares representan palabras. No es un mandato que tengan que escribir archivos de cierta manera; solo le dice que las instrucciones en la arquitectura esperan que las palabras de varios bytes tengan sus bytes ordenados de cierta manera. Una máquina big-endian puede escribir la misma secuencia de bytes que una máquina little-endian, solo podría usar algunas instrucciones más para hacerlo, porque tiene que reordenar los bytes. Lo mismo es cierto para las máquinas little-endian que escriben formatos big-endian.

Otros consejos

Necesita adivinarlo porque sabe algo más (es decir, sabe que está leyendo un archivo en formato big endian) o necesita codificar la endianness en el archivo de alguna manera. Los archivos de texto Unicode usan 0xFFFE (o algo similar) como los dos primeros bytes de un archivo de texto para calcular la resistencia. Si lo lees como 0xfffe, entonces está en el formato endian nativo. Si lo lees como 0xfeff, no lo es.

Tienes toda la razón ... sin una idea de los datos que estás viendo, no hay forma de saberlo.

Dicho esto, a menudo hay formas de adivinar ... si sabes que se supone que estás viendo texto, puedes realizar algunas pruebas simples para ver si lo que obtienes es razonable ... si puedes lea un encabezado, a menudo puede distinguirlo de eso ... pero si solo está mirando una secuencia de bytes, no hay una forma segura de saber .

  

¿Tiene sentido esto?

Sí: es un problema.

  

Siento que me falta algo súper básico aquí.

Básicamente, para leer un archivo (especialmente un archivo binario) necesita conocer el formato del archivo: que incluye saber si un par de bytes es una secuencia de bytes individuales, o si es una sola palabra de doble byte.

No te falta nada. Los formatos de archivo binarios bien definidos (como los libros de trabajo Excel 97-2003 xls, por ejemplo) deben incluir el endianness como parte de la especificación o obviamente tendrás grandes problemas.

Históricamente, el Macintosh usaba procesadores Motorola (el 68000 y sus sucesores) que eran big endian, mientras que las computadoras IBM PC / DOS / Windows siempre han usado procesadores Intel que son little endian. Por lo tanto, los proveedores de software con bases de código C / C ++ que se ejecutan en ambas plataformas están muy familiarizados con este problema, mientras que los proveedores de software que siempre han desarrollado software de Windows o Mac antes de que Apple se haya cambiado a Intel, podrían simplemente haberlo ignorado, al menos por su formatos de archivo propios.

No estoy seguro de si esto es exactamente lo que está preguntando, pero, por ejemplo, el formato de archivo PCAP especifica una resistencia variable:

http://www.winpcap.org/ntar/draft/PCAP -DumpFileFormat.html

El concepto es que puedes escribir un " marcador " byte, como 0x12345678, al encabezado de su archivo. En un & Quot; big endian & Quot; máquina como un PowerPC, se escribirá de la siguiente manera:

0x12 0x34 0x56 0x78

En un " little endian " máquina como un x86, se escribirá de la siguiente manera:

0x78 0x56 0x34 0x12

Luego, al leer su encabezado, puede saber por qué su leyó la máquina para determinar si necesita intercambiar bytes mientras lee el archivo. O puede especificar un endianness, como big endian. Entonces siempre intercambiarías bytes en una pequeña máquina endian.

En el caso del formato PCAP, esto se hizo por razones de rendimiento. Pero probablemente sea más simple especificar y endianness y apegarse a él.

El procesador funciona en uno u otro modo endian (algunos pueden cambiar según las páginas, etc.). No saben si están haciendo lo correcto o no. Simplemente hacen lo que hacen. (Basura adentro, basura afuera) :-)

No hay forma de detectar, diría. Pero en C #, el BitConverter tiene una propiedad IsLittleEndian.

Todo depende de cómo desee ingresarlo.

Lea más aquí .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top