Endianness
Endianness
Endianness
Índice
[ocultar]
1 Ejemplo
2 Ejemplo 2
3 Ejemplo 3
4 Ejemplo 4
5 Ejemplo 5
6 Referencias
7 Enlaces externos
Ejemplo[editar]
Un código simple en lenguaje C para detectar si una máquina es little-endian o big-endian:
#include <stdio.h>
int main(void)
{
int i = 1;
char *p = (char *) &i;
if ( p[0] == 1 )
printf("Little Endian\n");
else
printf("Big Endian\n");
return 0;
}
La explicación de su funcionamiento es sencilla, primero obtenemos la dirección de memoria
de un entero (por tanto su espacio de almacenamiento es de al menos 16 bits, i.e. 2 bytes) de
valor 1, 0001h en hexadecimal. Descomponiendo numéricamente en bytes el valor 00h es el
de mayor importancia numérica y el 01h el de menor. Lo que hacemos entonces es
leer (desde memoria) solamente el primer byte del mismo (de ahí el cast a char*), y si es 0
(00h) entonces la ordenación es de comienzo por el extremo mayor (big-endian), si es 1
(0x01) es de de comienzo por el extremo menor (little-endian).
Ejemplo 2[editar]
Este está basado en el orden de lectura de los bytes
#include <stdio.h>
int main()
{
union {
short s;
char c[sizeof(short)];
} un;
un.s = 0x0102;
if(sizeof(short) == 2)
{
if(un.c[0] == 1 && un.c[1] == 2)
printf("big-endian\n");
else if(un.c[0] == 2 && un.c[1] == 1)
printf("little-endian\n");
else
printf("unknown\n");
}
else
{
printf("sizeof(short) = %d\n", sizeof(short));
}
return(0);
}
Ejemplo 3[editar]
Utilizando estructuras union
union endianness
{
short short_16; //
[______16______]
unsigned char char_8[sizeof(short)]; //
[___8__][___8__]
}endianness;
Ejemplo 4[editar]
Utilizando el modulo sys del lenguaje Python
import sys
print sys.byteorder # 'little' o 'big'
Ejemplo 5[editar]
Utilizando el lenguaje Perl
use Config;
print $Config{byteorder} == 12345678 ? 'little-endian' : 'big-endian';
Referencias[editar]
Enlaces externos[editar]