Hola, somos Arume

Desarrollamos páginas web, aplicaciones para móviles, capas de realidad aumentada y aplicaciones para Facebook. Nos apasiona la informática y somos unos perfeccionistas incurables; por eso en nuestros proyectos utilizamos estándares.

tel. 625 519 694

Mendaña de Neyra, 34, 3º B, 15008, A Coruña

Autenticarse

Registrarse. ¿Has olvidado tu contraseña?

Etiquetas

Saltar las etiquetas

Suscríbete a las RSS

Estás en:

  • Inicio >
  • Blog >
  • Los formatos Big Endian y Little Endian

Los formatos Big Endian y Little Endian

02 Ago 2011 por Jose

Comentarios: 12

Orden

Al igual que existen lenguajes donde la lectura y escritura puede ser izquierda-derecha o derecha-izquierda también en el mundo de los ordenadores puede suceder algo parecido. En este artículo hablaremos de las distintas maneras en las que las máquinas pueden almacenar los datos en ficheros, que cobran especial relevancia cuando se trata de trabajar con datos de más de un byte (Endianness), como por ejemplo números enteros, números reales, ...

A la hora de expresar estos datos tenemos que definir el concepto de byte más representativo (MSB) y byte menos representativo (LSB), que se denomina así al byte que modificado altera el dato en mayor medida y al que lo hace en menor medida. Por ejemplo, expresando el número 13 como binario de 8 bits sería 0000 1101, el MSB sería 0000 y el LSB sería 1011 puesto que, por ejemplo, 0001 1011 = 27 dista más que 0000 1111 = 15.

Pues bien, el formato Big Endian es aquel que ordena los bytes del más significativo al menos significativo y el Little Endian es el que lo hace del menos significativo al más significativo. Veamos cómo:

Big Endian

Este formato que puede parecer una forma más "natural" de escritura es utilizado por procesadores usados en máquinas Apple entre otras.

Los datos 13 y "trece" expresados en hexadecimal son 0x3133 y 0x74726563650d0a, pues bien escritos como datos de 2 bytes en formato Big Endian quedan:

0x31 0x33
y
0x74 0x72 0x65 0x63 0x65 0x0d 0x0a

Little Endian

Este formato es adoptado por la mayoría de procesadores Intel.

Los mismos datos hexadecimales de antes escritos como datos de 2 bytes en formato Little Endian quedan:

0x33 0x31
y
0x0a 0x0d 0x65 0x63 0x65 0x72 0x74

Decir que existen algunas arquitecturas que permiten elegir el Endianness a usar; éstas se conocen con el nombre de Bi-endian.

¿En qué me afecta esto a mi?

En ocasiones tendremos que leer algún fichero de datos y deberemos conocer bajo qué formato ha sido creado, y modificarlo en caso de que no coincida con el de nuestra máquina para que los datos sean correctos al procesarlos.

En otra ocasión he hablado del Bit Order Mask, pues ésta es la forma que tiene la codificación de caracteres Unicode de marcar si los datos han sido guardados en Little Endian o Big Endian.

  • 0xfe 0xff: UTF-16 Big Endian
  • 0xff 0xfe: UTF-16 Little Endian
  • 0x00 0x00 0xfe 0xff: UTF-32 Big Endian
  • 0xff 0xfe 0x00 0x00: UTF-32 Little Endian
  • 0xef 0xbb 0xbf: UTF-8

Comentarios

12 comentarios. Comentar.

1. Anónimo el 25 Abr 2013 a las 17:55:45

Los anteriores juegos de caracteres pueden ser guardados en las dos opciones.

Pero en En utf-8 ¿Cómo son guardados en Big o Litle?

Saludos

2. Anónimo el 03 Ago 2014 a las 09:11:20

En UTF-8 no interesa, ya que BE y LE afectan cuando son mas de 1 byte.

3. Anónimo el 22 Oct 2014 a las 11:39:56

Gracias por el blog :))

5. Luis S. el 16 Feb 2015 a las 00:21:33

Los datos 13 y "trece" expresados en hexadecimal son 0x3133 y 0x74726563650d0a De dónde sale esa respuesta, que acaso 13 en hexadecimal no es 0xD ?

6. Luis el 16 Feb 2015 a las 12:49:52

Hola Luis S.

La conversión dada es de ASCII a hexadecimal, no de decimal a hexadecimal.

7. ivan el 22 Ago 2015 a las 18:47:07

Dentro de esta página pude entender de forma sencilla lo que significa los términos asi como su utilización básica

Dependiendo del sistema operativo en que se trabaje, hay que considerar el orden de los bytes en los tipos de datos numéricos que utilizan varios bytes. Existen dos formatos diferentes, denominados "Little Endian" y "Big Endian".

"Little Endian" significa que el byte de menor peso se almacena en la dirección más baja de memoria y el byte de mayor peso en la más alta.

Así, un Long Int de 4 bytes

Byte3 Byte2 Byte1 Byte0

se almacenará en memoria de la siguiente manera:

Dirección Base +0 ===> Byte0

Dirección Base +1 ===> Byte1

Dirección Base +2 ===> Byte2

Dirección Base +3 ===> Byte3

Los procesadores Intel (usados en la mayoría de los ordenadores personales) y los DEC Alpha RISC son "Little Endian".

En el formato "Big Endian" el byte de mayor peso se almacena en la dirección más baja de memoria y el byte de menor peso en la dirección más alta.

El Long Int anterior, se almacenaría ahora así:

Dirección Base +0 ===> Byte3

Dirección Base +1 ===> Byte2

Dirección Base +2 ===> Byte1

Dirección Base +3 ===> Byte0

La mayoría de los sistemas UNIX, el protocolo de Internet TCP, los procesadores Motorola 680x0 (y, por lo tanto, los Macintosh), Hewlett-Packard PA-RISC, y Sun SuperSPARC son "Big Endian". El MIPS de Silicon Graphics y el procesador IBM/Motorola PowerPC son capaces de entender ambos sistemas, por lo que se dice que son "bi-endian".

Como se puede ver la diferencia sustancial de estos dos formatos de almacenamiento es simplemente el orden de almacenamiento acuerdo a su valor o equivalencia

Por otra parte

En la forma "Little Endian", las instrucciones en ensamblador para elegir 1, 2, 4 o un número mayor de bytes proceden de la misma forma: primero se lee el byte de menor peso, que está en el offset (desplazamiento) 0.

Además, la relación 1:1 entre el offset y el número del byte hace que las rutinas matemáticas sean más sencillas de implementar.

En la forma "Big Endian", al tener el byte de mayor peso el primero, se puede comprobar de forma directa si el número es positivo o negativo sólo comprobando el primer byte (recordemos que el signo se almacena en el primer bit) y sin necesidad de saber la longitud del número.

Esta forma de representación coincide con el orden en que los números son escritos, de modo que las rutinas de conversión entre sistemas de numeración son más eficientes que si se realizaran en "Little Endian".

A la hora de realizar un programa, puede ser necesario conseguir que éste sepa diferenciar entre ambos formatos y actúe consecuentemente al que se esté utilizando.

Si se desea que un programa funcione en varias plataformas hay que tener en cuenta si éstas usan el mismo formato, y si es distinto adaptar el programa a ello. De lo contrario, si se utilizaran ficheros binarios el programa no funcionaría, al tomar valores incorrectos.

El protocolo TCP usa el formato "Big Endian", por lo que los sistemas que usan "Little Endian" deben convertir los datos al crear los paquetes TCP/IP.

Los formatos "Little Endian" y "Big Endian" pueden aplicarse, además de a la ordenación de los bytes, a la ordenación de los bits.

En un byte, un sistema que utilice "Little Endian" tendrá el bit de menor peso en el primer bit y el bit de mayor peso en el último bit. En un sistema "Big Endian", el bit de mayor peso estará en el primer bit y el de menor peso en el último.

Al aplicarse tanto a la ordenación de bytes como de bits, aprovechando las ventajas de cada uno, podemos encontrar sistemas en los que se utiliza el formato "Big Endian" para los bytes y el "Little Endian" para la ordenación de los bits internamente en cada byte, o viceversa.

8. Dublín el 09 May 2016 a las 21:28:06

Hola, disculpen pero me queda la duda la cual es: ¿Si está guardado el Big o Little endian, podría afectar al valor como tal?

9. Miguel Angel Cabrera Mouzo el 05 Mar 2017 a las 17:48:44

El número 13 expresado en 8 bits es 0000 1101 y no 000 1101 como habéis puesto vosotros, corregidlo porfa :)

10. Miguel Angel Cabrera Mouzo el 05 Mar 2017 a las 18:07:04

**y no 0000 1011**

11. Luis el 05 Mar 2017 a las 22:25:26

Efectivamente Miguel Angel, había un error en el artículo y lo hemos corregido.

Gracias.

12. Anónimo el 02 May 2017 a las 05:19:34

Luis, me parece que tu artículo confunde en vez de aclarar. Tu ejemplo con el 13 o "trece" es una cadena de caracteres o string. Los string como tales no sufren de endianess. Solo los números cuando se almacenan tienen ese problema y es relativo al diseño de las ALUs de los procesadores. Por favor corregir urgente porque es un ERROR GROSERO.

13. El Corrector de errores el 08 Nov 2017 a las 23:23:00

Lo corregiremos /o/

Comentar

Comentar de forma anónima

Puedes comentar poniendo cualquier nombre o apodo, exceptuando los nombres de usuarios registrados. Máximo de 50 caracteres.

Comentar como usuario registrado

Registrarse. ¿Has olvidado tu contraseña?