2012-04-19 120 views
0

我有從Java客戶端發送int到C++服務器的問題。我不想改變服務器的代碼(我聽到有關htonl的一些信息)。現在從客戶端13928(0011 0110 0110 1000)發送我的服務器6829568(0110 1000 0011 0110 0000 0000)。有沒有Java的任何功能類似於htonl?如何通過套接字發送int C++服務器/ Java客戶端

+0

如何將13928轉換爲客戶端上的字節,以及如何將字節轉換爲服務器上的6829568? – 2012-04-19 07:23:03

回答

2

更改服務器的代碼。它壞了。

問題是服務器「理解」的格式實際上根據其CPU架構而不同。 Java正在發送標準網絡字節順序,這是正確的事情 - 服務器然後必須ntohl()將其轉換爲其內部格式。改變客戶端代碼以包含關於服務器端序的假設是一個非常糟糕的主意。

+0

你肯定不知道。這當然是可能的,但服務器也可能會說明使用little-endian字節排序的明確定義的協議。 – 2012-04-19 08:07:09

+0

@David Schwartz:呃,我是在假設OP對htonl的引用是相關的假設下運作的。 – 2012-04-19 08:15:23

+0

在這些情況下,我將endian處理卸載到客戶端。服務器以其本地端序進行操作/通信。客戶端執行endian處理,只有當它與服務器不同時... – Malkocoglu 2012-04-19 10:20:39

1

只是做數學。使用位移,邏輯AND和邏輯OR。例如,提取四個八位字節,你可以使用:

x & 0xff 
(x >> 8) & 0xff 
(x >> 16) & 0xff 
(x >> 24) % 0xff 

相反>> 8,你可以使用/ 256。您可以使用% 256而不是& 0xff。把操作放在一起。

0

查看XDR,這個定義了客戶端和服務器之間通信時應該使用的標準。如果可能的話,將cleint的int複製到一個字符串中,然後將該字符串發送給服務器,並將字符串轉換爲整數。這是發送int最有效的方式。

相關問題