C#服务器与JAVA客户端之间的网络通信:如何处理。过渡?

问题描述 投票:0回答:2

我有一个不能更改的C#服务器。在C#中,字节的范围为0到255,而在JAVA中,字节的范围是-128至127。

我已经阅读了有关无符号字节/整数/等的问题,而我发现的唯一实际选择是使用“更多内存”来表示无符号的东西:http://darksleep.com/player/JavaAndUnsignedTypes.html

是真的吗?

因此,当JAVA客户端和C#服务器之间进行网络通信时,JAVA客户端会从服务器接收字节数组。服务器将它们发送为“无符号”,但是在接收时将被解释为有符号字节,对吗?

然后我是否必须将每个字节都转换为一个Int型,然后将127个添加到每个字节中?

我不确定这里...但是如何将其解释为与C#服务器上相同的值(整数,字符串等?

我发现整个情况非常混乱(更不用说Endianess问题了,但这是另一篇文章)。

java networking unsigned
2个回答
2
投票

一个字节在C#中为0-255,而不是0-254。

但是,在大多数情况下,您真的不需要担心-基本上在C#和Java中,字节都是8位。如果从C#发送字节数组,则Java中将收到相同的位,反之亦然。然后,如果将该字节数组的一部分转换为32位整数,字符串等,则一切正常。 Java中字节的有符号性几乎总是无关紧要的-只有当您数字对待它们时,这才是问题。

问题的更多是(例如)在Java中将32位整数转换为4个字节然后在C#中读取数据时可能产生不同字节序的可能性,反之亦然。您必须提供有关您要做什么的更多信息,以便我们为您提供帮助。特别是您已经有需要遵守的协议吗?如果是这样,那几乎就决定了您需要做的事情-它的难易程度取决于协议的内容。

如果使用choose协议,则可能希望使用独立于平台的序列化格式,例如Protocol Buffers,该格式可用于.NET和Java。


1
投票

[不幸的是,答案是至少在某种程度上“使用更多的内存”。

您可以在Java中将数据作为byte数组存储,但是当您需要以数字方式使用该数据时,则需要上移至int并将256添加到负值。按位&将为您快速有效地完成此操作。

int foo;
if (byte[3] < 0)
    foo = (byte[3] & 0xFF);
else
    foo = byte[3];
© www.soinside.com 2019 - 2024. All rights reserved.