Orden de bytes

La versión actual de la página aún no ha sido revisada por colaboradores experimentados y puede diferir significativamente de la versión revisada el 13 de noviembre de 2018; las comprobaciones requieren 39 ediciones .

En los sistemas informáticos y de comunicación digital modernos, la información suele representarse como una secuencia de bytes . En el caso de que el número no se pueda representar con un byte, importa en qué orden se escriben los bytes en la memoria de la computadora o se transmiten a través de las líneas de comunicación. A menudo, la elección del orden de los bytes es arbitraria y está determinada únicamente por convenciones.

En general, para representar un número M mayor que 255 (aquí  , el número entero máximo que se puede escribir en un byte ), debe usar varios bytes (n). En este caso, el número M se escribe en el sistema numérico posicional en base 256:

El conjunto de enteros , cada uno entre 0 y 255, es la secuencia de bytes que componen M. En este caso, se  llama el byte bajo y el byte alto del número M.

Dado que la computadora no se ocupa de los bits individuales (solo se pueden obtener a través de campos de bits ), el orden de los bits en un byte es importante solo en la organización física del almacenamiento y la transmisión de datos, puede diferir de un dispositivo a otro y, por lo general, no es que necesita un programador de aplicaciones.

Opciones de grabación

Ordenar de mayor a menor

Ordenar de mayor a menor ( inglés  big-endian  - from the big end): . Este orden es similar al orden de escritura habitual (por ejemplo , en números arábigos ) "de izquierda a derecha", por ejemplo, el número ciento veintitrés se escribiría en un orden tal como 123 . En el mismo orden, se acostumbra escribir bytes en la literatura técnica y educativa, a menos que se indique explícitamente otro orden.

Este orden es estándar para los protocolos TCP/IP , se usa en encabezados de paquetes de datos y en muchos protocolos de nivel superior diseñados para usarse sobre TCP/IP. Por lo tanto, el orden de bytes de mayor a menor a menudo se denomina "orden de bytes de red" ( ing.  orden de bytes de red ). Este orden de bytes es utilizado por los procesadores IBM 360/370/390, SPARC , Motorola 68000 (de ahí el tercer nombre: orden de bytes de Motorola , ing. Orden de  bytes de Motorola ).

Con este orden de bytes, es conveniente comparar cadenas (puede compararlas con campos enteros, partes de mayor capacidad, cada una de las cuales contiene varios caracteres a la vez).

El orden de bytes de mayor a menor también se usa en muchos formatos de archivo  , por ejemplo, PNG , FLV , EBML , JPEG .

Ordenar de menor a mayor

Ordene de menor a mayor ( ing.  little-endian  - desde el extremo pequeño):

Este es el orden inverso al habitual de escribir números en números arábigos , por ejemplo, el número ciento veintitrés se escribiría en un orden tal como 321 . En otras palabras, este orden es similar a la regla de escritura de derecha a izquierda.

Este orden de escritura se adopta en la memoria de las computadoras personales con procesadores de arquitectura x86 y, por lo tanto, a veces se le llama orden de bytes de Intel (por el nombre de la empresa que creó la arquitectura x86). Los procesadores x86 modernos le permiten trabajar con operandos de uno, dos, cuatro y ocho bytes. En este orden de bytes, es muy conveniente que cuando aumenta el tamaño (número de bytes) del operando, el valor de su primer byte permanece invariable: 3210 → 3210'0000. En orden de mayor a menor, el valor cambiaría, por ejemplo: 0123 → 0000'0123;

Además de x86, este orden de bytes se usa en arquitecturas VAX (de ahí otro nombre para el inglés.  Orden de bytes VAX [1] ), DEC Alpha y muchos otros.

Además, el orden "de menor a mayor" se usa en la tabla de particiones USB , PCI , GUID , es recomendado por FidoNet . Pero, en general, la convención little-endian admite menos protocolos multiplataforma y formatos de datos que big-endian .

Orden conmutable

Muchos procesadores pueden funcionar en orden de menor a mayor y viceversa, como ARM (el valor predeterminado es little endian), PowerPC (excepto PowerPC 970 ), DEC Alpha , MIPS , PA-RISC e IA-64 . El orden de los bytes generalmente se selecciona mediante software durante la inicialización del sistema operativo , pero también se puede seleccionar mediante puentes de hardware en la placa base. En este caso, es más correcto hablar de endianness a nivel de sistema operativo. La endianidad conmutable a veces se denomina engl.  bi-endian .

Orden mixto

El orden de bytes mixto (combinado, híbrido) ( en inglés  middle-endian) a veces se usa cuando se trabaja con números cuya longitud excede la palabra de la máquina . El número está representado por una secuencia de palabras de máquina , que están escritas en un formato que es natural para esta arquitectura, pero las propias palabras de máquina siguen en orden inverso.

Los procesadores VAX y ARM utilizan una representación mixta para números reales largos.

Ejemplo

El siguiente es un ejemplo que describe la ubicación de un número de 4 bytes en la memoria RAM de una computadora, al que se puede acceder como una palabra de 32 bits y byte por byte.

Todos los números están escritos en sistema numérico hexadecimal.

Número: 0xA1B2C3D4
Actuación
Ordenar de menor a mayor (little-endian)
Ordenar de mayor a menor (extremo grande)
Orden adoptada en PDP-11 (PDP-endian)

Determinando la endianidad

El orden de bytes (endianness) en una máquina en particular se puede determinar usando el programa C (testbyteorder.c):

#incluir <stdio.h> #incluir <stdint.h> int principal () { uint16_t x = 0x0001 ; printf ( "%s-endian \n " , * (( uint8_t * ) & x ) ? "pequeño" : "grande" ); }

Ejecución de resultados en una máquina big-endian ( SPARC ):

$ uname -m sparc64 $ gcc -o orden de bytes de prueba orden de bytes de prueba.c $ ./pedido de bytes de prueba big-endian

Ejecute los resultados en una máquina little-endian ( x86 ):

$ uname -m i386 $ gcc -o orden de bytes de prueba orden de bytes de prueba.c $ ./pedido de bytes de prueba little-endian

Números reales

El almacenamiento de números reales también puede depender del endianismo. Por ejemplo, en x86 , los formatos IEEE 754 se usan con signo y exponente en bytes altos.

Unicode

Si Unicode está escrito en formato UTF-16 o UTF-32 , entonces el endianness ya es significativo. Una de las formas de indicar el orden de los bytes en los textos Unicode es prefijar el carácter especial BOM ( byte order mark , byte order mark , U+FEFF) - la versión "invertida" de este carácter (U+FFFE) no existe y no está permitido en los textos.

El carácter U+FEFF se representa en UTF-16 por la secuencia de bytes 0xFE 0xFF (big-endian) o 0xFF 0xFE (little-endian), y en UTF-32 por la secuencia de bytes 0x00 0x00 0xFE 0xFF (big-endian) o 0xFF 0xFE 0x00 0x00 (little-endian).

Problemas de compatibilidad y conversión

Escribir un número multibyte desde la memoria de la computadora a un archivo o transferirlo a través de una red requiere convenciones sobre qué byte se envía primero. La escritura directa en el orden en que se ubican los bytes en las celdas de memoria genera problemas tanto al transferir una aplicación de plataforma a plataforma como en el intercambio de datos de red entre sistemas.

Para convertir entre el orden de bytes de la red , que siempre es big-endian, y el orden de bytes del host , el estándar POSIX proporciona  las funciones , , , :  htonl()htons()ntohl()ntohs()

  • uint32_t htonl(uint32_t hostlong); - convierte un valor sin signo de 32 bits del orden de bytes local al orden de bytes de la red;
  • uint16_t htons(uint16_t hostshort); - convierte un valor sin signo de 16 bits del orden de bytes local al orden de bytes de la red;
  • uint32_t ntohl(uint32_t netlong); - convierte un valor sin signo de 32 bits del orden de bytes de red al orden de bytes local;
  • uint16_t ntohs(uint16_t netshort); — convierte un valor sin signo de 16 bits del orden de bytes de red al orden de bytes local.

Si el orden de bytes actual y la función de red coinciden, funcionarán como "vacíos", es decir, el orden de bytes no cambiará. El estándar también permite implementar estas funciones como macros.

Hay muchos idiomas y bibliotecas con facilidades para convertir hacia y desde los dos órdenes de bytes principales.

Kernel de Linux : , le16_to_cpu(), cpu_to_be32(), cpu_to_le16p()y así sucesivamente;

Núcleo FreeBSD : htobe16(), le32toh(), etc.;

Erlang :

<< Recuento : 32 / entero grande sin signo , Promedio : 64 / gran flotante >> = Trozo _ _ Mensaje = << Longitud : 32 / pequeño - entero - sin signo , MType : 16 / pequeño - entero - sin signo , MessageBody >>

Pitón :

import struct Count , Average = struct . desempaquetar ( ">Ld" , Chunk ) Mensaje = estructura . paquete ( "<LH" , Longitud , MType ) + MessageBody

Perla :

( $Recuento , $Promedio ) = desempaquetar ( 'L>d>' , $Parte ); $Mensaje = paquete ( '(LS)<' , $Longitud , $MType ) . $Cuerpo del mensaje ; ( o lo mismo : $Message = pack ( 'Vv' , $Length , $MType ) . $MessageBody ;)

estos ejemplos para Erlang, Python, Perl contienen una funcionalidad idéntica.

Los procesadores Intel x86-64 tienen una instrucción BSWAP para cambiar el orden de los bytes.

Etimología del nombre

Los términos big-endian y little-endian no estaban relacionados originalmente con la informática. Los viajes de Gulliver , una obra satírica de Jonathan Swift , describe los estados ficticios de Lilliputia y Blefuscu, que han estado en guerra entre sí durante muchos años debido a un desacuerdo sobre de qué extremo se deben partir los huevos cocidos . Aquellos que creen que deben romperse desde el extremo romo se denominan Big-endians ("puntas romas") en el trabajo.

Las disputas entre los partidarios de big-endian y little-endian en informática también suelen tener la naturaleza de los llamados. "guerras religiosas". [2] Los términos big-endian y little-endian fueron acuñados por Danny Cohen en 1980 en su artículo On Holy Wars and a Plea for Peace .  [3] [4]

Véase también

Notas

  1. paquete() en Perl . Consultado el 20 de diciembre de 2010. Archivado desde el original el 13 de diciembre de 2010.
  2. Preguntas frecuentes sobre Endian de DAV (enlace descendente) . Consultado el 3 de agosto de 2008. Archivado desde el original el 10 de noviembre de 2006. 
  3. Danny Cohen. On Holy Wars and a Plea for Peace  (inglés) (1 de abril de 1980). Fecha de acceso: 24 de enero de 2010. Archivado desde el original el 15 de febrero de 2012.
  4. Tanenbaum E. Arquitectura informática. - 5ª ed. - San Petersburgo. : Pedro, 2007. - 844 p. - S. 89.

Enlaces