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

Resuelto manav m-n asked hace 14 años • 24 respuestas

¿Existe una definición de macro de una línea para determinar el endianidad de la máquina? Estoy usando el siguiente código pero convertirlo a macro sería demasiado largo:

unsigned char test_endian( void )
{
    int test_var = 1;
    unsigned char *test_endian = (unsigned char*)&test_var;

    return (test_endian[0] == 0);
}
manav m-n avatar Jan 20 '10 16:01 manav m-n
Aceptado

Código que admite órdenes de bytes arbitrarios, listo para colocarse en un archivo llamado order32.h:

#ifndef ORDER32_H
#define ORDER32_H

#include <limits.h>
#include <stdint.h>

#if CHAR_BIT != 8
#error "unsupported char size"
#endif

enum
{
    O32_LITTLE_ENDIAN = 0x03020100ul,
    O32_BIG_ENDIAN = 0x00010203ul,
    O32_PDP_ENDIAN = 0x01000302ul,      /* DEC PDP-11 (aka ENDIAN_LITTLE_WORD) */
    O32_HONEYWELL_ENDIAN = 0x02030001ul /* Honeywell 316 (aka ENDIAN_BIG_WORD) */
};

static const union { unsigned char bytes[4]; uint32_t value; } o32_host_order =
    { { 0, 1, 2, 3 } };

#define O32_HOST_ORDER (o32_host_order.value)

#endif

Verificarías sistemas little endian a través de

O32_HOST_ORDER == O32_LITTLE_ENDIAN
Christoph avatar Jan 20 '2010 16:01 Christoph

Si tiene un compilador que admita literales compuestos C99:

#define IS_BIG_ENDIAN (!*(unsigned char *)&(uint16_t){1})

o:

#define IS_BIG_ENDIAN (!(union { uint16_t u16; unsigned char c; }){ .u16 = 1 }.c)

Sin embargo, en general, debería intentar escribir código que no dependa del endianidad de la plataforma anfitriona.


Ejemplo de implementación independiente del endianidad del host de ntohl():

uint32_t ntohl(uint32_t n)
{
    unsigned char *np = (unsigned char *)&n;

    return ((uint32_t)np[0] << 24) |
        ((uint32_t)np[1] << 16) |
        ((uint32_t)np[2] << 8) |
        (uint32_t)np[3];
}
caf avatar Jan 20 '2010 10:01 caf

No existe un estándar, pero en muchos sistemas, incluido el <endian.h>que le dará algunas definiciones que debe buscar.

Ignacio Vazquez-Abrams avatar Jan 20 '2010 09:01 Ignacio Vazquez-Abrams