0

我正在尝试将表示整数的字节数组从 ac# ASP.Net 页面发送到 java 客户端,如下所示

public void WriteToStream(int i)
{
    byte[] buffer = BitConverter.GetBytes(i);
    var writer = new MemoryStream();
    // Little - Endians to Big - Endians;
    Array.Reverse(buffer);
    // Unsigned Char to Signed Char
    sbyte[] suffer = (sbyte[])(Array)buffer;
    BinaryWriter binaryWriter = new BinaryWriter(writer);
    foreach (var sb in suffer)
    {
        binaryWriter.Write(sb);
    }
    binaryWriter.Close();
    buffer = writer.ToArray();
    writer.Close();
    // Writing to an Aspx Page Response Output Stream
    Response.OutputStream.Write(buffer, 0, buffer.Length);
}

在java方面

public int getInt(byte[] data)
{
    byte[] buffer;
    ByteArrayInputStream reader = new ByteArrayInputStream(data);
    buffer = new byte[4];
    reader.read(buffer, 0, 4);
    int i = ByteBuffer.wrap(buffer).getInt();
    return i;
}

这些过程对于小于128的整数正常工作,但对于128,java 端返回239。我知道这个问题与 java 内存存储是Big – Endians Signed Bytes而 .Net C# 是Little – Endians Unsigned Bytes的事实有关。我也知道以下帖子

从 Java 中的字节获取 int,首先在 C# 中编码

将 int 转换为字节数组时的不同结果 - .NET 与 Java

Java 和 C# - 字节数组到长转换的区别

但是我不能像上面的帖子所建议的那样改变java端。我必须修改 C# 端以适应另一端。

我该怎么做?

[更新]

我基于MiscUtil更改了 C# 端如下

public void WriteToStream(int i)
{
    var stream = new MemoryStream();
    var writer = new EndianBinaryWriter(EndianBitConverter.Big, stream);
    writer.Write(i);
    byte[] buffer = stream.ToArray();
    // Writing to an Aspx Page Response Output Stream
    Response.OutputStream.Write(buffer, 0, buffer.Length);
}

但是结果没有改变。Java 仍然返回239(同时期望128

为什么?我该如何纠正?

4

2 回答 2

0

如果您看到 -128 和 127 之间的数字工作正常,但任何高于 128 的数字都不起作用,是因为其中一方正在处理带符号的字节。

为此,我建议在C#端使用返回无符号字节的getbuffer方法

http://msdn.microsoft.com/en-us/library/system.io.memorystream.getbuffer.aspx

而且对于 JAVA 方面,您可以查看此答案中提到的 USIGNED LINK

将原始字节值转换为 Java 类型

于 2013-09-09T02:58:44.807 回答
0

简单的。使用 Jon Skeet 的 EndianBinaryWriter,它是MiscUtil的一部分。

于 2013-09-08T22:30:19.183 回答