I have written a simple C header for converting the endianness of short
integers and long
integers. It uses the GCC macro __BYTE_ORDER__
to check the system's byte order and define the macros based on that.
The header creates the macros LITTLE_ENDIAN_SHORT(n)
, LITTLE_ENDIAN_LONG(n)
, BIG_ENDIAN_SHORT(n)
, BIG_ENDIAN_LONG(n)
which convert the value n
from host endianness to the endianness specified.
Here is the source for endian.h
:
#ifndef ENDIAN_H
#define ENDIAN_H
#define REVERSE_SHORT(n) ((unsigned short) (((n & 0xFF) << 8) | \
((n & 0xFF00) >> 8)))
#define REVERSE_LONG(n) ((unsigned long) (((n & 0xFF) << 24) | \
((n & 0xFF00) << 8) | \
((n & 0xFF0000) >> 8) | \
((n & 0xFF000000) >> 24)))
#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
# define LITTLE_ENDIAN_SHORT(n) (n)
# define LITTLE_ENDIAN_LONG(n) (n)
# define BIG_ENDIAN_SHORT(n) REVERSE_SHORT(n)
# define BIG_ENDIAN_LONG(n) REVERSE_LONG(n)
#elif __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
# define LITTLE_ENDIAN_SHORT(n) REVERSE_SHORT(n)
# define LITTLE_ENDIAN_LONG(n) REVERSE_LONG(n)
# define BIG_ENDIAN_SHORT(n) (n)
# define BIG_ENDIAN_LONG(n) (n)
#else
# error unsupported endianness
#endif
#endif
Is this a good way to implement the macros or is there a better way?