c++64-bitportabilityendiannesshtonl

Is there any "standard" htonl-like function for 64 bits integers in C++?


I'm working on an implementation of the memcache protocol which, at some points, uses 64 bits integer values. These values must be stored in "network byte order".

I wish there was some uint64_t htonll(uint64_t value) function to do the change, but unfortunately, if it exist, I couldn't find it.

So I have 1 or 2 questions:

I have in mind a basic implementation but I don't know how to check the endianness at compile-time to make the code portable. So your help is more than welcome here ;)

Thank you.


Here is the final solution I wrote, thanks to Brian's solution.

uint64_t htonll(uint64_t value)
{
    // The answer is 42
    static const int num = 42;

    // Check the endianness
    if (*reinterpret_cast<const char*>(&num) == num)
    {
        const uint32_t high_part = htonl(static_cast<uint32_t>(value >> 32));
        const uint32_t low_part = htonl(static_cast<uint32_t>(value & 0xFFFFFFFFLL));

        return (static_cast<uint64_t>(low_part) << 32) | high_part;
    } else
    {
        return value;
    }
}

Solution

  • You are probably looking for bswap_64 I think it is supported pretty much everywhere but I wouldn't call it standard.

    You can easily check the endianness by creating an int with a value of 1, casting your int's address as a char* and checking the value of the first byte.

    For example:

    int num = 42;
    if(*(char *)&num == 42)
    {
       //Little Endian
    }
    else
    {
       //Big Endian
    } 
    

    Knowing this you could also make a simple function that does the swapping.


    You could also always use boost which contains endian macros which are portable cross platform.