2012-01-09 10 views
1

ネットワーク上で浮動小数点数のシリアライズを行うコードが見つかりました。ネットワーク上で浮動小数点数をシリアル化する方法は?

uint32_t htonf(float f) 
{ 
    uint32_t p; 
    uint32_t sign; 

    if (f < 0) { sign = 1; f = -f; } 
    else { sign = 0; } 

    p = ((((uint32_t)f)&0x7fff)<<16) | (sign<<31); // whole part and sign 
    p |= (uint32_t)(((f - (int)f) * 65536.0f))&0xffff; // fraction 

    return p; 
} 

仕様:上記のコードは32ビット数でフロートを格納する単純な実装の一種です。上位ビット(31)は数字の符号( "1"は負)を格納するために使用され、次の7ビット(30-16)は浮動小数点数の全部を格納するために使用されます。最後に、残りのビット(15-0)を使用して、数値の小数部分を格納する。

その他はうまくいきますが、これが何を意味するのかわかりません。これはどのようにして15-0ビットを得るのですか?なぜ「* 65536.0f」が必要なのですか?

p |= (uint32_t)(((f - (int)f) * 65536.0f))&0xffff 

誰でもこれについて説明できますか?

+1

あなたは何を達成しようとしていますか?両側のマシンが同じフォーマットを使用している場合や、別のマシンを処理したい場合は、これを有効にしますか?最初のケースでは、ビットを送信するだけです。 2番目の方法では、整数とスケール係数を明示的に送信し、受信側のフロートに再構成する必要があります。 –

答えて

5
f - (int)f 

あなたの数の小数部を与えます。この分数を16ビットで保存したいので、2^16の分数を分母と考えてください。分子は:

(f - (int)f) * 65536.0f) 

残りは、ビットシフトを使用して32ビット番号の右ビットにパックします。その後、その32ビットintは、他の32ビットintと同様にネットワーク上で直列化され、おそらく上記のルーチンの反対側が浮動小数点数を再作成するために使用されます。

-1

ユニオンを使用できます。

uint32_t htonf(float f) 
{ 
    union { 
     float f1; 
     uint32_t i1; 
    }; 
    f1 = f; 
    return i1; 
} 
+0

これはOP質問に返信しません – greydet

関連する問題