2014-10-11 90 views
0

如果这个问题的标题不清楚,我很抱歉,但我无法弄清楚用这么几个字来描述我的困境的最佳方式。在无符号字节变量中表示有符号字节

我正在使用套接字和逐字节传输信息编写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服务器接收到一个字节。

我已经尝试了许多方法来做到这一点,但没有成功。如果任何人有任何想法,我该如何去做这件事,我会非常感激。

回答

5

你基本上不需要做任何事情,除了停止将字节看作数字。把它们想象成8位,Java和C#是完全相同的。你真的很想将一个字节视为一个大小 - 它通常只是像图像这样的二进制数据,或者是编码的文本。

如果您希望将字节10100011从Java跨越到C#或反之亦然,只需以最自然的方式进行。这些位将是正确的,即使字节值在将它们视为数字时会有所不同。

目前尚不完全清楚您实际尝试传播的是什么数据,但在99.9%的情况下,您可以将byte[]视为不透明的二进制数据,然后传输而不用担心。

如果你需要把字节看作幅度,你需要找出你想要的范围。处理Java范围更容易,因为C#可以使用sbyte[]来支持它...但如果你想 0-255范围内,你只需要在byte转换为int在Java端,并掩盖它的低8位:

byte b = ...; 
int unsigned = b & 0xff; 

如果你真的需要把byte[]sbyte[]或反过来在C#上,你可以使用一个小秘密:即使C#不允许你在两者之间进行转换,CLR也可以。你所要做的就是通过将参考转换为object来愚弄C#编译器,认为它可能可能有效 - 否则它认为它最好。所以这个执行没有例外:

byte[] x = new byte[] { 255 }; 
sbyte[] y = (sbyte[]) (object) x; 
Console.WriteLine(y[0]); // -1 

你可以用完全相同的方式在另一个方向转换。

+0

问题是我需要他们作为他们两端的正确数字,因为我使用这些数组来存储诸如整数之类的东西。 – 2014-10-11 20:32:15

+0

@LexWebb:除非这些实际上是1字节的整数,否则你会使用类似'BinaryReader'或'DataInputStream'的东西 - 在这一点上字节不再被真正当作有符号字节处理。请在关于您实际在做什么的问题中提供更多背景 - 因为我仍然怀疑您不需要担心签名。更可能的是,您需要担心多字节整数的字节顺序。如果你真的想要,我已经编辑了我的答案,告诉你如何使用sbyte []'。 – 2014-10-11 20:35:01

+0

我实际上试图通过使用这些类的Java源代码的修改版本来复制C#中的DataInputStream和输出流的行为。我这样做是因为我以前尝试将这两种语言的读者和作者结合起来并不成功。 – 2014-10-11 20:38:23

相关问题