2014-07-16 29 views
2

我想通過套接字將float值從java發送到C++,沒有任何第三方庫和字節順序安全。如何通過套接字連接將float從java發送到C++?

在C++端,我處理字節順序(使用beej指南中的htonf)。但我怎樣才能處理在Java中的字節順序?對於int,字節順序似乎由java socket處理得很好,但float不傳輸正確的值。或者轉換爲字符串安全發送浮動的唯一方法?

的java:

DataOutputStream out; 
out.writeFloat(val); 

C++從beej指南轉換方法:

float ntohf(uint32_t p) 
{ 
    float f = ((p>>16)&0x7fff); // whole part 
    f += (p&0xffff)/65536.0f; // fraction 

    if (((p>>31)&0x1) == 0x1) { f = -f; } // sign bit set 

    return f; 
} 
+4

爲什麼不作爲字符串發送並轉換爲浮點數? – Sorter

+2

您是否想過查閱規格? DataOutputStream writeFloat:「使用Float類中的floatToIntBits方法將float參數轉換爲int,然後將該int值作爲4字節數量寫入底層輸出流,先寫高字節,如果沒有拋出異常,則寫入計數器增加4。「和floatToIntBits:「位31(由掩碼0x80000000選擇的位)表示浮點數的符號....」 –

+2

@DeepakMishra由於額外的16個字節問題 –

回答

2

ntohf函數解釋p爲固定固定點數目。整個部分爲15位,分數爲16位,符號爲1。這不是Java使用的格式。

大多數現代機器都具有兼容的浮點表示。你會很安全地直接傳遞位。例如:

float f = reinterpret_cast<float&>(ntohl(n)); 
+0

唯一的問題是該字節順序可能(實際上可能會)需要調整。 –

+0

我需要自動字節順序調整 – user2212461

+2

'ntohl'負責。 –