2011-05-06 43 views
5

我想从java客户端发送数据到c#服务器,并无法将int转换为字节数组。不同的结果时,将int转换为字节数组 - .NET vs Java

当我使用此代码转换的数量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

你必须改变字节序:内部为大端

bb.order(ByteOrder.LITTLE_ENDIAN) 

的Java商店的东西,而.NET是小端默认。

另外,Java和.NET之间在签名和未签名方面存在差异。 Java使用带符号的字节,C#使用无符号的。你将不得不改变这一点。

基本上,这就是为什么你看到-106(150 - 256)

你将不得不做一些像下面的实用方法:

public static void putUnsignedInt (ByteBuffer bb, long value) 
    { 
     bb.putInt ((int)(value & 0xffffffffL)); 
    } 

注意,值长。

+0

Well ByteBuffer被记录(所以阅读jdoc会有帮助)使用BigEndian作为默认值,但这实际上是一个有趣的问题,Java是否定义了使用的ByteOrder?我怀疑它 - 会是一个很高的性能打击,反正不明显(除非写输出,我们可以根据文档轻松地将其转换) – Voo 2011-05-07 00:08:38

+0

我认为现在的输出将是-106,32,067,010, – 2011-05-07 00:09:53

+0

@Bala R - 已签名和未签名的已添加点 – manojlds 2011-05-07 00:11:13