【发布时间】:2014-12-06 18:37:43
【问题描述】:
如果这个问题的标题不清楚,我深表歉意,但我想不出用这么几句话来描述我的困境的最佳方式。
我正在编写一个 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# 客户端向 java 服务器发送 255,我将在 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);
}
我基本上需要将 java 的有符号字节表示形式存储在无符号 C# 字节中,以便将该字节发送到服务器。我还需要反向执行此操作,以从我的 java 服务器接收到的字节中获取一个 sbyte。
我尝试了很多方法来做到这一点,但都没有成功。如果有人知道我该如何解决这个问题,我将不胜感激。
【问题讨论】: