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
64-битный ntohl() в с ++?
Мы используем файлы cookies для улучшения работы сайта. Оставаясь на нашем сайте, вы соглашаетесь с условиями использования файлов cookies. Чтобы ознакомиться с нашими Положениями о конфиденциальности и об использовании файлов cookie, нажмите здесь.