日期:2014-05-17  浏览次数:20994 次

4byte合成一个Int
比如有一个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];
.

结果出来的数是错的。。。

------解决方案--------------------
t_Load = (R_buff[1] << 24) + (R_buff[2] << 16) + (R_buff[3] << 8) + R_buff[4];
------解决方案--------------------
出错是因为可能由正直变成负值
比如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];


------解决方案--------------------
引用:
引用:int i = BitConverter.ToInt32(R_buff, 0)

猜测是高低位的排列导致的,你给的这个函数,应该是0方低位byte,1放高位byte。。而我的是0放高位,1放低位。

准确的说是网络字节序,也就是常说的大端模式
在Windows中,本地数据都是小端模式的
那你试下这样int i = System.Net.IPAddress.NetworkToHostOrder(BitConverter.ToInt32(R_buff, 1));