2

我正在使用miscutil库使用套接字在 Java 和 C# 应用程序之间进行通信。我试图找出以下代码之间的区别(这是 Groovy,但 Java 结果是相同的):

import java.io.*

def baos = new ByteArrayOutputStream();
def stream = new DataOutputStream(baos);
stream.writeInt(5000)

baos.toByteArray().each { println it }

/* outputs - 0, 0, 19, -120 */

和 C#:

using (var ms = new MemoryStream())
using (EndianBinaryWriter writer = new EndianBinaryWriter(EndianBitConverter.Big, ms, Encoding.UTF8))
{
  writer.Write(5000);
  ms.Position = 0;
  foreach (byte bb in ms.ToArray())
  {
    Console.WriteLine(bb);
  }
}

/* outputs - 0, 0, 19, 136 */

如您所见,最后一个字节-120在 Java 版本和136C# 中。

4

1 回答 1

7

这与 Java(JVM)中的字节是有符号的,而在 C# 中它们不是。它与大端或小端表示无关。

换句话说,Java 的字节范围为-128 - 127,而 C# 的字节范围为0 - 255.

因此,当试图127在 Java 中表示上面的一个字节时,您会溢出并环绕到-120.

来自Java 教程

byte: byte 数据类型是一个 8 位有符号二进制补码整数。它的最小值为 -128,最大值为 127(含)。字节数据类型可用于在大型数组中节省内存,其中内存节省实际上很重要。它们也可以用来代替 int ,它们的限制有助于澄清您的代码;变量的范围有限这一事实可以作为一种文档形式。

MSDN

Byte 值类型表示无符号整数,取值范围为 0 到 255。

于 2010-04-08T05:16:31.837 回答