5

倍精度浮動小数点数をネットワーク経由で送信したいと考えています。(標準 C、標準ソケット) データをネットワーク バイト オーダーとの間で変換するための htond または ntohd はありません。私は何をすべきか?頭の中にいくつかの解決策がありますが、一般的な方法を知りたいです。

(gstreamer で使用される gint64 値のように、64 ビット int を送信するための一般的な方法も知りたいです)

編集:これは私が考えた1つの解決策です。任意のサイズの整数で機能すると思いますが、倍精度では正しいですか?

void swap_if_necessary (void* buff, int buff_len) 
{
    uint32_t foo = 1;
    if ( htonl(foo) != foo ) 
    {
        char* to_swap = (char*)buff;

        int i;
        for (i = 0; i < buff_len/2; i++)
        {
            char  swap_buff = to_swap[i];
            to_swap[i] = to_swap[buff_len -1 -i];  
            to_swap[buff_len -1 -i] = swap_buff;
        }  
    }
}
4

3 に答える 3

10

合意された文字列形式に変換して送信します。それが一般的な慣行なのか、まともなのかはわかりませんが、私にとってはうまくいきました(非常に多くの値を送信していなかったので、その時点でパフォーマンスを気にしていなかったのは事実です).

于 2011-05-21T20:32:58.273 に答える
5

Andre が言っているのは、2 進浮動小数点数はネットワーク全体で信頼できないということです。これは、コンピューター アーキテクチャが異なるためです。バイト オーダー (ビッグ/リトル エンディアン) を超える違い。したがって、文字列への変換や XDR などのライブラリの使用などは、データが異なるコンピューター アーキテクチャで処理される可能性がある場合に本当に必要です。

整数と文字の単純な形式は、エンディアンを調整するだけですり抜けることができますが、浮動小数点はより複雑になります。

于 2011-05-21T21:38:59.313 に答える
4

rfc1014で最初に定義されたXDRを見たいと思うかもしれません。明らかに、プラットフォームに XDR を実装するライブラリを見つけたいと思うでしょう。

于 2011-05-21T20:32:14.160 に答える