"Endianicidad" designa el formato en el que se almacenan los datos de más de un byte en un ordenador. El sistema big-endian adoptado por Motorola entre otros, consiste en representar los bytes en el orden "natural", así el valor hexadecimal 0x4A3B2C1D se codificaría en memoria en la secuencia {4A, 3B, 2C, 1D}. En el sistema little-endian adoptado por Intel, entre otros, el mismo valor se codificaría como {1D, 2C, 3B, 4A}, de manera que de este modo se hace más intuitivo el acceso a datos, porque se efectúa fácilmente de manera incremental de menos relevante a más relevante (siempre se opera con incrementos de contador en la memoria).

Algunas arquitecturas de microprocesador pueden trabajar con ambos formatos (ARM, PowerPC, DEC Alpha, PA-RISC, Arquitectura MIPS), y a veces son referidas como sistemas middle-endian.

Comprobación en C

Una posible forma de comprobar qué sistema utilizamos mediante un programa en C es con el siguiente código:

#include
int main(int argc, char **argv)
{
   int i = 1;
   char *p = (char *) &i;
   if ( p[0] == 1 )
        printf("Little Endian\n");
   else
        printf("Big Endian\n");
   return 0;
}

Se obtiene la dirección de memoria de un entero, con un espacio de almacenamiento de al menos 16 bits, cuyo valor es 1. Leemos el primer byte y si es 1 es que little-endian. Para leer el primer byte del entero, hacemos una conversión de tipo puntero a carácter.

Comprobación en Bash

El siguiente comando utiliza el caracter ASCII "I", cuyo valor en octal en sistemas little-endian es 000111, mientras que en sistemas big-endian es 0444000. Basta comprobar el último carácter para conocer el tipo de sistema. Si es 1 es que utilizamos little-endian:

$ echo -n I | od -to2 | head -n1 | cut -f2 -d" " | cut -c6
1

También podemos utilizar awk:

$ awk 'BEGIN {c="I"; printf "%c",c}' | od | head -n1 | cut -f2 -d" " | cut -c6
1

Comprobación en Python

Utilizando el método pack:

$ python -c "from struct import pack;print(int(pack('@h',1)==pack('
Consultando la propiedad byteorder:
$ python -c "import sys;print sys.byteorder"
little
$ python -c "import sys;print(0 if sys.byteorder=='big' else 1)"
1

Comprobación en Perl

El resultado haciendo la comprobación en Perl es 1234 para little-endian.

$ perl -MConfig -e 'print "$Config{byteorder}\n";'
1234

También se puede utilizar la función pack:

$ perl -MConfig -e 'print pack("L", 1) ne pack("N", 1);'
1

Entradas relacionadas


Published

Category

admin

Tags

Contacto