私はこの質問への答えに大きな問題を抱えています
それでも、この質問は多かれ少なかれ私が探しているものです。ネットワークから double を受け取り、それを自分のマシンで適切にエンコードしたいのです。
受け取った場合は、int
次を使用してこのコードを実行しますntohl
。
int * piData = reinterpret_cast<int*>((void*)pData);
//manage endianness of incomming network data
unsigned long ulValue = ntohl(*piData);
int iValue = static_cast<int>(ulValue);
しかし、 を受け取った場合double
、どうすればよいかわかりません。
質問に対する答えは、次のことを提案しています。
template <typename T>
void swap_endian(T& pX)
{
char& raw = reinterpret_cast<char&>(pX);
std::reverse(&raw, &raw + sizeof(T));
}
ただし、このサイトを引用すると、次のようになります。
The ntohl() function converts the unsigned integer netlong from network byte order to host byte order.
When the two byte orders are different, this means the endian-ness of the data will be changed. When the two byte orders are the same, the data will not be changed.
それどころか、質問に対する@GManNickGの回答は常にstd::reverse
.
この答えが間違っていると考えると、私は間違っていますか? ntohl
( OPの質問のタイトルでは正確に述べられていませんでしたが、の使用が示唆するエンディアンのネットワーク管理の範囲で)。
最後に: mydouble
を 4 バイトの 2 つの部分に分割し、2 つの部分にntohl
関数を適用する必要がありますか? もっと標準的な解決策はありますか?
Cには、ホストからネットワークへの二重の興味深い質問もありますか? 、ただし、32 ビット値に制限されます。そして答えは、アーキテクチャの違いにより、倍精度を文字列に変換する必要があると言っています...オーディオサンプルも扱うつもりですが、データベース内のすべてのサンプルを文字列に変換することを本当に検討する必要がありますか? ( double は、ネットワーク経由でクエリを実行するデータベースから取得されます)