2012-01-09 21 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」表示負數),接下來的七位(30-16)用於存儲浮點的整數部分。最後,剩餘的位(15-0)用於存儲數字的小數部分。

其他都很好,但我不明白這意味着什麼。這是如何讓我們獲得15-0比特的?爲什麼我們需要「* 65536.0f」?

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

任何人都可以解釋一下嗎?

+1

你想完成什麼?如果兩端機器的花車使用相同的格式,或者您想處理不同的機器,您是否只想讓它工作?在第一種情況下,只傳輸比特。在第二種情況下,您可能需要明確傳輸一個整數和一個縮放因子,然後在接收端將其重構爲一個浮點數。 – 2012-01-09 05:06:48

回答

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 2012-11-28 13:21:48

相關問題