比如有一个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];.结果出来的数是错的

解决方案 »

  1.   

    int i = BitConverter.ToInt32(R_buff, 0)
      

  2.   

    这样应该可以了吧?                    t_Load = R_buff[5];
                        t_Load <<= 8;
                        t_Load += R_buff[6];
                        t_Load <<= 8;
                        t_Load += R_buff[7];
                        t_Load <<= 8;
                        t_Load += R_buff[8];
      

  3.   


    你这个我测试出的结果是错的因为我的R_buff里面不只是4个数据,而是20组byte。。
      

  4.   

    你有病么?我问你了么?再说了。这个里面有个startindex,我也设置了,可是结果还是错的。
      

  5.   

    t_Load = (R_buff[1] << 24) + (R_buff[2] << 16) + (R_buff[3] << 8) + R_buff[4];
      

  6.   


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

  7.   

    你要看一下,你当前分解成Byte[]流时,用的是大端还是小端(是网络字节序还是window的本地字节序)
    所以,有可能是
    t_Load = R_buff[4] << 24 + R_buff[3] << 16 + R_buff[2] << 8 + R_buff[1];
      

  8.   

    t_Load = (R_buff[4] << 24) | (R_buff[3] << 16) | (R_buff[2] << 8) | R_buff[1];
      

  9.   


    好吧,原来是这个问题<<的优先级不如+我给忘记了。多谢!!
      

  10.   

    出错是因为可能由正直变成负值
    比如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];
      

  11.   

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

  12.   

    public static unsafe int ToInt32(byte[] value, int startIndex)
    {
        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]);
        }
    }