network little endian big and c byte endianness

c - network - little endian and big endian pdf



Programa de C para chequear Little vs. Big Endian (4)

Posible duplicado:
¿Definición de la macro C para determinar la máquina big endian o little endian?

int main() { int x = 1; char *y = (char*)&x; printf("%c/n",*y+48); }

Si es little endian imprimirá 1. Si es big endian imprimirá 0. ¿Es correcto? ¿O si el ajuste de un char * a int x siempre apunta al bit menos significativo, independientemente de la endianidad?


En resumen, sí.

Supongamos que estamos en una máquina de 32 bits.

Si es little endian, la x en la memoria será algo como:

higher memory -----> +----+----+----+----+ |0x01|0x00|0x00|0x00| +----+----+----+----+ A | &x

entonces (char*)(&x) == 1 , y *y+48 == ''1'' .

Si es big endian, será:

+----+----+----+----+ |0x00|0x00|0x00|0x01| +----+----+----+----+ A | &x

así que este será ''0'' .


Esta es la prueba big endian de un script de configure :

#include <inttypes.h> int main(int argc, char ** argv){ volatile uint32_t i=0x01234567; // return 0 for big endian, 1 for little endian. return (*((uint8_t*)(&i))) == 0x67; }


Lo siguiente hará.

unsigned int x = 1; printf ("%d", (int) (((char *)&x)[0]));

Y la configuración de &x a char * le permitirá acceder a los bytes individuales del entero, y el orden de los bytes dependerá de la naturaleza del sistema.


Pensé que sabía que había leído sobre eso en la norma; pero no puedo encontrarlo Sigue buscando. Antiguo; encabezado de respuesta no Q-tex; P:

El siguiente programa determinaría que:

#include <stdio.h> #include <stdint.h> int is_big_endian(void) { union { uint32_t i; char c[4]; } e = { 0x01000000 }; return e.c[0]; } int main(void) { printf("System is %s-endian./n", is_big_endian() ? "big" : "little"); return 0; }

Usted también tiene este enfoque ; de Quake II:

byte swaptest[2] = {1,0}; if ( *(short *)swaptest == 1) { bigendien = false;

Y !is_big_endian() no es 100% para ser poco ya que puede ser mezclado / medio.

Creo que esto se puede verificar usando el mismo enfoque, solo cambie el valor de 0x01000000 a 0x01020304 dando:

switch(e.c[0]) { case 0x01: BIG case 0x02: MIX default: LITTLE

Pero no estoy completamente seguro de eso ...