私は、ある時点で 64 ビットの整数値を使用する memcache プロトコルの実装に取り組んでいます。これらの値は、「ネットワーク バイト オーダー」で格納する必要があります。
変更を行う機能が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;
}
}