我正在尝试将一个表示整数的字节数组从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 )
为什么呢?我该如何纠正呢?
答案 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