最近在做java服务器以c#客户端交互时发现c#中int转换成byte[]到java再转换回来出了问题。
原来我的转换代码如下:
public static int ByteArrayToInt(byte[] data, int startIndex)
{
int value = 0;
for (int i=0; i<4; i++)
{
//java中byte[]转int
//int shift = (4-1-i)*8;
value+=(data[i+startIndex]&0x000000FF) << shift;
//下面的运算方法也行;
//value <<= 8;
//value |= (data[i+startIndex] & 0xFF);
}
return value;
}
这个我在java中转换是可以的 , 但是和C#交互时就出错了,或来经过打印数据分析我发现C#中int转byte[]他们的存储数据的方式是不一样的,比如 数字1
在java中转换成byte[]后他们具体值是:by[0] = 0 by[1] = 0 by[2] = 0 by[3] = 1;
而在C#中是:by[0] = 1 by[1] = 0 by[2] = 0 by[3] = 0; 他们是相反的 所以代码做如下改动就可以了:
public static int ByteArrayToInt(byte[] data, int startIndex)
{
int value = 0;
for (int i=0; i<4; i++)
{
int shift = i * 8;
value+=(data[i+startIndex]&0x000000FF) << shift;
}
return value;
}
好了这样我的问题就解决了!!!!!!!!
在这里再补充一点C#的转换其实就是把java byte[]转换成int 的方法用到C#中这样就行了直接上代码
/// <summary>
/// 将java传来的byte[]转换成Int;
/// </summary>
/// <param name="data"></param>
/// <param name="startIndex"></param>
/// <returns></returns>
public static int ByteArrayToInt(byte[] data, int startIndex)
{
int value = 0;
for (int i=0; i<4; i++)
{
int shift = (4 - 1 - i) * 8;
value += (data[i + startIndex] & 0x000000FF) << shift;
}
return value;
}