【问题标题】:Issue sending an array of bytes representing an integer from c# to java client将表示整数的字节数组从 c# 发送到 java 客户端的问题
【发布时间】:2013-09-12 09:51:16
【问题描述】:

我正在尝试将表示整数的字节数组从 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 Unsigned Bytes 的事实有关。我也知道以下帖子

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

为什么?我该如何纠正?

【问题讨论】:

  • 128 到 239 表明除了字节顺序以外的其他原因导致了问题。我建议您以十六进制格式的字节输出字节流,并确保进入连接的数据是正确的,并且在将字节转换为整数之前与来自连接的数据匹配。

标签: c# java int bytearray converter


【解决方案1】:

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

【讨论】:

  • 感谢您的回答。我已经更新了问题以反映您的建议,但问题仍然存在。请你看一下,看看我可能在哪里犯错?再次感谢。
【解决方案2】:

如果您看到 -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

【讨论】:

    猜你喜欢
    • 2011-10-11
    • 2012-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-19
    • 1970-01-01
    • 1970-01-01
    • 2018-09-27
    相关资源
    最近更新 更多