64-битный ntohl() в с ++?

Я бы порекомендовал прочитать little-endian это: http://commandcenter.blogspot.com/2012/04/byte-order-fallacy.html

#include 
#include 
#include 

uint64_t
ntoh64(const uint64_t *input)
{
    uint64_t rval;
    uint8_t *data = (uint8_t *)&rval;

    data[0] = *input >> 56;
    data[1] = *input >> 48;
    data[2] = *input >> 40;
    data[3] = *input >> 32;
    data[4] = *input >> 24;
    data[5] = *input >> 16;
    data[6] = *input >> 8;
    data[7] = *input >> 0;

    return rval;
}

uint64_t
hton64(const uint64_t *input)
{
    return (ntoh64(input));
}

int
main(void)
{
    uint64_t ull;

    ull = 1;
    printf("%"PRIu64"\n", ull);

    ull = ntoh64(&ull);
    printf("%"PRIu64"\n", ull);

    ull = hton64(&ull);
    printf("%"PRIu64"\n", ull);

    return 0;
}

Будет показан следующий 64bit результат:

1
72057594037927936
1

Вы можете проверить endianness это с помощью ntohl(), если 64bit отбросите верхние 4 байта.

Также byte-order вы можете превратить это c++ в красивую шаблонную функцию 64bit на C++, которая будет работать little-endian с целыми числами любого размера:

template 
static inline T
hton_any(const T &input)
{
    T output(0);
    const std::size_t size = sizeof(input);
    uint8_t *data = reinterpret_cast(&output);

    for (std::size_t i = 0; i < size; i++) {
        data[i] = input >> ((size - i - 1) * 8);
    }

    return output;
}

Теперь 64-bit ваш 128-битный код тоже безопасен!

c++

linux

64-bit

endianness

2022-10-06T20:35:45+00:00
Вопросы с похожей тематикой, как у вопроса:

64-битный ntohl() в с ++?