2012-04-19 114 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最有效的方式。

相关问题