Skip to content

Instantly share code, notes, and snippets.

@kiug
Forked from panzi/portable_endian.h
Last active August 29, 2015 14:15
Show Gist options
  • Select an option

  • Save kiug/7f48583b8dac068ae2ee to your computer and use it in GitHub Desktop.

Select an option

Save kiug/7f48583b8dac068ae2ee to your computer and use it in GitHub Desktop.

Revisions

  1. kiug revised this gist Feb 16, 2015. 1 changed file with 16 additions and 3 deletions.
    19 changes: 16 additions & 3 deletions portable_endian.h
    Original file line number Diff line number Diff line change
    @@ -79,7 +79,14 @@ static inline uint64_t htonll(uint64_t v)

    /* little endian */
    if(*(char *)&x == 1)
    return ((((uint64_t)htonl(v)) << 32) + htonl(v >> 32));
    return (((v & (uint64_t)0x00000000000000ffULL) << 56) |
    ((v & (uint64_t)0x000000000000ff00ULL) << 40) |
    ((v & (uint64_t)0x0000000000ff0000ULL) << 24) |
    ((v & (uint64_t)0x00000000ff000000ULL) << 8) |
    ((v & (uint64_t)0x000000ff00000000ULL) >> 8) |
    ((v & (uint64_t)0x0000ff0000000000ULL) >> 24) |
    ((v & (uint64_t)0x00ff000000000000ULL) >> 40) |
    ((v & (uint64_t)0xff00000000000000ULL) >> 56));
    /* big endian */
    else
    return v;
    @@ -93,8 +100,14 @@ static inline uint64_t ntohll(uint64_t v)

    /* little endian */
    if(*(char *)&x == 1)
    return ((((uint64_t)ntohl(v)) << 32) + ntohl(v >> 32));

    return (((v & (uint64_t)0x00000000000000ffULL) << 56) |
    ((v & (uint64_t)0x000000000000ff00ULL) << 40) |
    ((v & (uint64_t)0x0000000000ff0000ULL) << 24) |
    ((v & (uint64_t)0x00000000ff000000ULL) << 8) |
    ((v & (uint64_t)0x000000ff00000000ULL) >> 8) |
    ((v & (uint64_t)0x0000ff0000000000ULL) >> 24) |
    ((v & (uint64_t)0x00ff000000000000ULL) >> 40) |
    ((v & (uint64_t)0xff00000000000000ULL) >> 56));
    /* big endian */
    else
    return v;
  2. kiug revised this gist Feb 16, 2015. 1 changed file with 30 additions and 0 deletions.
    30 changes: 30 additions & 0 deletions portable_endian.h
    Original file line number Diff line number Diff line change
    @@ -72,6 +72,36 @@
    # define be32toh(x) ntohl(x)
    # define le32toh(x) (x)

    # ifndef htonll
    static inline uint64_t htonll(uint64_t v)
    {
    int x = 1;

    /* little endian */
    if(*(char *)&x == 1)
    return ((((uint64_t)htonl(v)) << 32) + htonl(v >> 32));
    /* big endian */
    else
    return v;
    }
    # endif

    # ifndef ntohll
    static inline uint64_t ntohll(uint64_t v)
    {
    int x = 1;

    /* little endian */
    if(*(char *)&x == 1)
    return ((((uint64_t)ntohl(v)) << 32) + ntohl(v >> 32));

    /* big endian */
    else
    return v;

    }
    # endif

    # define htobe64(x) htonll(x)
    # define htole64(x) (x)
    # define be64toh(x) ntohll(x)
  3. @panzi panzi revised this gist Jun 11, 2014. 1 changed file with 3 additions and 0 deletions.
    3 changes: 3 additions & 0 deletions portable_endian.h
    Original file line number Diff line number Diff line change
    @@ -1,3 +1,6 @@
    // "License": Public Domain
    // I, Mathias Panzenböck, place this file hereby into the public domain. Use it at your own risk for whatever you like.

    #ifndef PORTABLE_ENDIAN_H__
    #define PORTABLE_ENDIAN_H__

  4. @panzi panzi revised this gist Apr 28, 2014. 1 changed file with 24 additions and 24 deletions.
    48 changes: 24 additions & 24 deletions portable_endian.h
    Original file line number Diff line number Diff line change
    @@ -15,20 +15,20 @@

    # include <libkern/OSByteOrder.h>

    # define htobe16 OSSwapHostToBigInt16
    # define htole16 OSSwapHostToLittleInt16
    # define be16toh OSSwapBigToHostInt16
    # define le16toh OSSwapLittleToHostInt16
    # define htobe16(x) OSSwapHostToBigInt16(x)
    # define htole16(x) OSSwapHostToLittleInt16(x)
    # define be16toh(x) OSSwapBigToHostInt16(x)
    # define le16toh(x) OSSwapLittleToHostInt16(x)

    # define htobe32 OSSwapHostToBigInt32
    # define htole32 OSSwapHostToLittleInt32
    # define be32toh OSSwapBigToHostInt32
    # define le32toh OSSwapLittleToHostInt32
    # define htobe32(x) OSSwapHostToBigInt32(x)
    # define htole32(x) OSSwapHostToLittleInt32(x)
    # define be32toh(x) OSSwapBigToHostInt32(x)
    # define le32toh(x) OSSwapLittleToHostInt32(x)

    # define htobe64 OSSwapHostToBigInt64
    # define htole64 OSSwapHostToLittleInt64
    # define be64toh OSSwapBigToHostInt64
    # define le64toh OSSwapLittleToHostInt64
    # define htobe64(x) OSSwapHostToBigInt64(x)
    # define htole64(x) OSSwapHostToLittleInt64(x)
    # define be64toh(x) OSSwapBigToHostInt64(x)
    # define le64toh(x) OSSwapLittleToHostInt64(x)

    # define __BYTE_ORDER BYTE_ORDER
    # define __BIG_ENDIAN BIG_ENDIAN
    @@ -43,14 +43,14 @@

    # include <sys/endian.h>

    # define be16toh betoh16
    # define le16toh letoh16
    # define be16toh(x) betoh16(x)
    # define le16toh(x) letoh16(x)

    # define be32toh betoh32
    # define le32toh letoh32
    # define be32toh(x) betoh32(x)
    # define le32toh(x) letoh32(x)

    # define be64toh betoh64
    # define le64toh letoh64
    # define be64toh(x) betoh64(x)
    # define le64toh(x) letoh64(x)

    #elif defined(__WINDOWS__)

    @@ -59,19 +59,19 @@

    # if BYTE_ORDER == LITTLE_ENDIAN

    # define htobe16 htons
    # define htobe16(x) htons(x)
    # define htole16(x) (x)
    # define be16toh ntohs
    # define be16toh(x) ntohs(x)
    # define le16toh(x) (x)

    # define htobe32 htonl
    # define htobe32(x) htonl(x)
    # define htole32(x) (x)
    # define be32toh ntohl
    # define be32toh(x) ntohl(x)
    # define le32toh(x) (x)

    # define htobe64 htonll
    # define htobe64(x) htonll(x)
    # define htole64(x) (x)
    # define be64toh ntohll
    # define be64toh(x) ntohll(x)
    # define le64toh(x) (x)

    # elif BYTE_ORDER == BIG_ENDIAN
  5. @panzi panzi created this gist Oct 6, 2013.
    112 changes: 112 additions & 0 deletions portable_endian.h
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,112 @@
    #ifndef PORTABLE_ENDIAN_H__
    #define PORTABLE_ENDIAN_H__

    #if (defined(_WIN16) || defined(_WIN32) || defined(_WIN64)) && !defined(__WINDOWS__)

    # define __WINDOWS__

    #endif

    #if defined(__linux__) || defined(__CYGWIN__)

    # include <endian.h>

    #elif defined(__APPLE__)

    # include <libkern/OSByteOrder.h>

    # define htobe16 OSSwapHostToBigInt16
    # define htole16 OSSwapHostToLittleInt16
    # define be16toh OSSwapBigToHostInt16
    # define le16toh OSSwapLittleToHostInt16

    # define htobe32 OSSwapHostToBigInt32
    # define htole32 OSSwapHostToLittleInt32
    # define be32toh OSSwapBigToHostInt32
    # define le32toh OSSwapLittleToHostInt32

    # define htobe64 OSSwapHostToBigInt64
    # define htole64 OSSwapHostToLittleInt64
    # define be64toh OSSwapBigToHostInt64
    # define le64toh OSSwapLittleToHostInt64

    # define __BYTE_ORDER BYTE_ORDER
    # define __BIG_ENDIAN BIG_ENDIAN
    # define __LITTLE_ENDIAN LITTLE_ENDIAN
    # define __PDP_ENDIAN PDP_ENDIAN

    #elif defined(__OpenBSD__)

    # include <sys/endian.h>

    #elif defined(__NetBSD__) || defined(__FreeBSD__) || defined(__DragonFly__)

    # include <sys/endian.h>

    # define be16toh betoh16
    # define le16toh letoh16

    # define be32toh betoh32
    # define le32toh letoh32

    # define be64toh betoh64
    # define le64toh letoh64

    #elif defined(__WINDOWS__)

    # include <winsock2.h>
    # include <sys/param.h>

    # if BYTE_ORDER == LITTLE_ENDIAN

    # define htobe16 htons
    # define htole16(x) (x)
    # define be16toh ntohs
    # define le16toh(x) (x)

    # define htobe32 htonl
    # define htole32(x) (x)
    # define be32toh ntohl
    # define le32toh(x) (x)

    # define htobe64 htonll
    # define htole64(x) (x)
    # define be64toh ntohll
    # define le64toh(x) (x)

    # elif BYTE_ORDER == BIG_ENDIAN

    /* that would be xbox 360 */
    # define htobe16(x) (x)
    # define htole16(x) __builtin_bswap16(x)
    # define be16toh(x) (x)
    # define le16toh(x) __builtin_bswap16(x)

    # define htobe32(x) (x)
    # define htole32(x) __builtin_bswap32(x)
    # define be32toh(x) (x)
    # define le32toh(x) __builtin_bswap32(x)

    # define htobe64(x) (x)
    # define htole64(x) __builtin_bswap64(x)
    # define be64toh(x) (x)
    # define le64toh(x) __builtin_bswap64(x)

    # else

    # error byte order not supported

    # endif

    # define __BYTE_ORDER BYTE_ORDER
    # define __BIG_ENDIAN BIG_ENDIAN
    # define __LITTLE_ENDIAN LITTLE_ENDIAN
    # define __PDP_ENDIAN PDP_ENDIAN

    #else

    # error platform not supported

    #endif

    #endif