繁体   English   中英

从C#向Java客户端发送代表整数的字节数组的问题

[英]Issue sending an array of bytes representing an integer from c# to java client

我正在尝试将表示整数的字节数组从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内存存储为大– Endians带符号字节而.Net C#为小– Endians无符号字节这一事实有关。 我也知道以下帖子

从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

为什么? 以及我该如何纠正?

简单。 使用Jon Skeet的EndianBinaryWriter(可作为MiscUtil的一部分获得)。

如果您看到-128到127之间的数字可以正常工作,但高于128的任何数字都不起作用,是因为双方之一正在处理已签名的字节。

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

http://msdn.microsoft.com/zh-CN/library/system.io.memorystream.getbuffer.aspx

对于Java方面,您还可以查看此答案中提到的USIGNED LINK

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM