将int转换为字节数组时的不同结果 - .NET vs Java

Ida*_*dan 5 c# java

我试图将数据从java客户端发送到ac#server并且无法将int转换为字节数组.

当我使用此代码使用c#转换数字8342时:

BitConverter.GetBytes(8342)
Run Code Online (Sandbox Code Playgroud)

结果是:x [4] = {150,32,0,0}

用java我用:

ByteBuffer bb = ByteBuffer.allocate(4); 
bb.putInt(8342); 
return bb.array();
Run Code Online (Sandbox Code Playgroud)

这里的结果是:x [4] = {0,0,32,-106}

谁能解释一下?我是java新手,这是我第一次在字节数组中看到负数.

man*_*lds 9

你必须改变endianess:

 bb.order(ByteOrder.LITTLE_ENDIAN)
Run Code Online (Sandbox Code Playgroud)

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));
    }
Run Code Online (Sandbox Code Playgroud)

请注意,值很长.