我正在研究 memcache 协议的实现,该协议在某些时候使用 64 位整数值。这些值必须以“网络字节顺序”存储。
我希望有一些uint64_t htonll(uint64_t value)
功能可以进行更改,但不幸的是,如果它存在,我找不到它。
所以我有1或2个问题:
- 是否有任何可移植(Windows、Linux、AIX)标准功能来做到这一点?
- 如果没有这样的功能,你将如何实现它?
我想到了一个基本的实现,但我不知道如何在编译时检查字节序以使代码可移植。因此,这里非常欢迎您的帮助;)
谢谢你。
这是我写的最终解决方案,感谢布赖恩的解决方案。
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;
}
}