如果这个问题的标题不清楚,我很抱歉,但我无法弄清楚用这么几个字来描述我的困境的最佳方式。在无符号字节变量中表示有符号字节
我正在使用套接字和逐字节传输信息编写java和C#之间的通信框架。
我遇到了一个让我困惑了几个小时的问题。正如你所希望的那样。 java的字节基类型是有符号的,这意味着如果你想以整数形式表示它,它可以存储-128到+127。然而,C#使用无符号字节,这意味着它以整数形式存储0-255。
这是我遇到问题的地方。如果需要从我的C#客户端发送的信息的一些字节到我的Java服务器,我使用下面的代码:
C#:
MemoryStream stream;
public void write(byte[] b, int off, int len) {
stream.Write(b, off, len);
}
的Java:
DataInputStream in;
public int read(byte[] b, int off, int len) throws IOException{
in.read(b, off, len));
}
正如你可以看到这些是非常非常相似的代码片段,当在他们自己的语言中使用时会产生可预测的结果。但是,由于签名的差异,这些数据会产生不可用的数据。
即如果我从我的C#客户端发送255到java服务器,我将在java服务器上收到值-1。这是因为这两个值都表示这8位:11111111
最好为了解决此问题,我需要使用以下代码,使用sbyte
,c#的有符号字节。
C#:
MemoryStream stream;
public void write(sbyte[] b, int off, int len) {
//Code to change sbyte into a byte but keeping it in the form in which java will understand
stream.Write(b, off, len);
}
我基本上需要存储,以传达给服务器发送一个字节的无符号的C#字节内有符号字节Java的表示。我也需要做相反的操作,以便从我的java服务器接收到一个字节。
我已经尝试了许多方法来做到这一点,但没有成功。如果任何人有任何想法,我该如何去做这件事,我会非常感激。
问题是我需要他们作为他们两端的正确数字,因为我使用这些数组来存储诸如整数之类的东西。 – 2014-10-11 20:32:15
@LexWebb:除非这些实际上是1字节的整数,否则你会使用类似'BinaryReader'或'DataInputStream'的东西 - 在这一点上字节不再被真正当作有符号字节处理。请在关于您实际在做什么的问题中提供更多背景 - 因为我仍然怀疑您不需要担心签名。更可能的是,您需要担心多字节整数的字节顺序。如果你真的想要,我已经编辑了我的答案,告诉你如何使用sbyte []'。 – 2014-10-11 20:35:01
我实际上试图通过使用这些类的Java源代码的修改版本来复制C#中的DataInputStream和输出流的行为。我这样做是因为我以前尝试将这两种语言的读者和作者结合起来并不成功。 – 2014-10-11 20:38:23