提问人:Idan 提问时间:5/7/2011 最后编辑:BoltClockIdan 更新时间:6/3/2011 访问量:6525
将 int 转换为字节数组时出现不同的结果 - .NET 与 Java
different results when converting int to byte array - .NET vs Java
问:
我正在尝试将数据从 java 客户端发送到 c# 服务器,但在将 int 转换为字节数组时遇到问题。
当我使用以下代码将数字 8342 与 C# 转换时:
BitConverter.GetBytes(8342)
结果为:x[4] = { 150, 32, 0, 0 }
在 Java 中,我使用:
ByteBuffer bb = ByteBuffer.allocate(4);
bb.putInt(8342);
return bb.array();
这里的结果为:x[4] = { 0, 0, 32, -106 }
有人可以解释一下吗?我是 java 的新手,这是我第一次在字节数组中看到负数。
答:
9赞
manojlds
5/7/2011
#1
你必须改变 endianess:
bb.order(ByteOrder.LITTLE_ENDIAN)
Java 在内部存储内容为 Big Endian,而 .NET 默认为 Little Endian。
此外,Java 和 .NET 在有符号和无符号方面也存在差异。Java 使用有符号字节,C# 使用无符号字节。你也必须改变它。
基本上,这就是为什么您会看到 -106 ( 150 - 256 )
您将不得不执行类似于以下实用程序方法的操作:
public static void putUnsignedInt (ByteBuffer bb, long value)
{
bb.putInt ((int)(value & 0xffffffffL));
}
请注意,value 很长。
评论
0赞
Voo
5/7/2011
好吧,ByteBuffer 是文档(所以阅读 jdoc 会有所帮助)使用 BigEndian 作为默认值,但这实际上是一个有趣的问题,Java 是否定义了使用的 ByteOrder?我对此表示怀疑 - 这将是一个很高的性能打击,无论如何都不会引起注意(除非在编写输出时,我们可以根据文档轻松地将其转换到那里)
0赞
Bala R
5/7/2011
我认为现在输出将是 -106、32、0、0
0赞
Idan
5/7/2011
在添加的行之后: ByteOrder.LITTLE_ENDIAN数组确实改变了它的顺序。为了让 c# 服务器理解它,我需要将字节数组更改为无符号。有没有办法告诉 ByteBuffer 这样做,或者我需要更改每个字节?
1赞
Gabe
5/7/2011
@idan:-106 和 150 是同一个字节;它们只是以不同的方式转换为字符串或更大的整数。由于 Java 没有办法表示无符号字节,因此无法在 Java 中将 150 表示为字节。
评论