将表示整数的字节数组从 C# 发送到 Java 客户端时出现问题
本文关键字:Java 客户端 问题 整数 表示 字节 字节数 数组 | 更新日期: 2023-09-27 18:30:40
我正在尝试将表示整数的字节数组从 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);
}
在爪哇方面
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内存存储很大 - 字节序有符号字节,而.Net C#很小 - 字节序无符号字节。我也知道以下帖子
从 Java 中的字节中获取 int,首先在 C# 中编码
将 int 转换为字节数组时的不同结果 - .NET 与 Java
Java 和 C# - 字节数组到长转换差
但是我不能像上面的帖子所建议的那样更改 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/en-us/library/system.io.memorystream.getbuffer.aspx
同样对于 JAVA 端,您可以查看此答案中提到的 USIGNED 链接
将原始字节值转换为 Java 类型