我發現了一段代碼來做網絡上的浮點數序列化。如何在網絡上進行浮點數序列化?
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
任何人都可以解釋一下嗎?
你想完成什麼?如果兩端機器的花車使用相同的格式,或者您想處理不同的機器,您是否只想讓它工作?在第一種情況下,只傳輸比特。在第二種情況下,您可能需要明確傳輸一個整數和一個縮放因子,然後在接收端將其重構爲一個浮點數。 – 2012-01-09 05:06:48