发出表示从c#到java客户端的整数的字节数组的问题

时间:2013-09-08 22:24:18

标签: c# java int bytearray converter

我正在尝试将一个表示整数的字节数组从c#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无符号字节。我也知道以下帖子

Get int from bytes in Java, encoded first in C#

different results when converting int to byte array - .NET vs Java

Java and C# - byte array to long conversion difference

但是我不能像上面的帖子那样改变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

为什么呢?我该如何纠正呢?

2 个答案:

答案 0 :(得分:0)

易。使用Jon Skeet的EndianBinaryWriter,作为MiscUtil的一部分提供。

答案 1 :(得分:0)

如果你看到介于-128和127之间的数字工作正常,但高于128的数字不起作用是因为其中一方将字节处理为有符号。

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

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

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

Converting raw-byte values into Java types