【发布时间】: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