比如有一个Byte数组,R_buff[1]~R_buff[4].
我要把他们合成一个有符号的int型:t_Load
我用的是:
t_Load = R_buff[1] << 24 + R_buff[2] << 16 + R_buff[3] << 8 + R_buff[4];.结果出来的数是错的
我要把他们合成一个有符号的int型:t_Load
我用的是:
t_Load = R_buff[1] << 24 + R_buff[2] << 16 + R_buff[3] << 8 + R_buff[4];.结果出来的数是错的
t_Load <<= 8;
t_Load += R_buff[6];
t_Load <<= 8;
t_Load += R_buff[7];
t_Load <<= 8;
t_Load += R_buff[8];
你这个我测试出的结果是错的因为我的R_buff里面不只是4个数据,而是20组byte。。
猜测是高低位的排列导致的,你给的这个函数,应该是0方低位byte,1放高位byte。。而我的是0放高位,1放低位。
所以,有可能是
t_Load = R_buff[4] << 24 + R_buff[3] << 16 + R_buff[2] << 8 + R_buff[1];
好吧,原来是这个问题<<的优先级不如+我给忘记了。多谢!!
比如R_buff[1]为255,二进制表示为1111 1111,左移24位就是0xFF 00 00 00,而计算机里是用补码表示的,这个数就变成了负数,因为符号位为1,那么这个数实际上是-16777216,这样就达不到LZ要的效果了。不如直接计算好了t_Load=R_buffer[1]*0x1000000+R_buffer[2]*0x10000+R_buffer[3]*0x100+R_buffer[4];
在Windows中,本地数据都是小端模式的
那你试下这样int i = System.Net.IPAddress.NetworkToHostOrder(BitConverter.ToInt32(R_buff, 1));
{
fixed (byte* numRef = &(value[startIndex]))
{
if ((startIndex % 4) == 0)
{
return *(((int*) numRef));
}
if (IsLittleEndian)
{
return (((numRef[0] | (numRef[1] << 8)) | (numRef[2] << 0x10)) | (numRef[3] << 0x18));
}
return ((((numRef[0] << 0x18) | (numRef[1] << 0x10)) | (numRef[2] << 8)) | numRef[3]);
}
}