【发布时间】:2011-03-02 15:23:43
【问题描述】:
我正在研究 memcache 协议的实现,该协议在某些时候使用 64 位整数值。这些值必须以“网络字节顺序”存储。
我希望有一些 uint64_t htonll(uint64_t value) 函数来进行更改,但不幸的是,如果它存在,我找不到它。
所以我有 1 或 2 个问题:
- 是否有任何便携(Windows、Linux、AIX)标准功能可以做到这一点?
- 如果没有这个功能,你会如何实现?
我想到了一个基本的实现,但我不知道如何在编译时检查字节序以使代码可移植。因此,这里非常欢迎您的帮助;)
谢谢。
这是我写的最终解决方案,感谢 Brian 的解决方案。
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;
}
}
【问题讨论】:
-
@ereOn:我也有类似的问题here。如果可能的话,你能看看,让我知道我在这里做错了什么吗?
-
不要将您的答案包含在问题中,而应该让您的答案带有答案。它更具可读性。
标签: c++ 64-bit portability endianness htonl