问题:将表示整数的字节数组从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)
为什么??我该怎么纠正呢
# 1 楼答案
如果您看到-128和127之间的数字可以正常工作,但如果128以上的数字不能正常工作,则是因为其中一个边正在处理带符号的字节
为此,我建议在C#端使用返回无符号字节的getbuffer方法
http://msdn.microsoft.com/en-us/library/system.io.memorystream.getbuffer.aspx
对于JAVA方面,您还可以查看这个答案中提到的USIGNED链接
Converting raw-byte values into Java types
# 2 楼答案
简单。使用Jon Skeet的EndianBinaryWriter,它是MiscUtil的一部分