有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

我试图从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签名字节。Net C#是小的无符号字节。我也知道下面的帖子

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#side以适应另一端

我该怎么做

[更新]

我根据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) 个答案

  1. # 2 楼答案

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