[英]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端。 我必须修改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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.