解决方案 »

  1.   

    个人觉得在string转成byte的时候,可以将byte反转Array.Reverse(bytes);
      

  2.   

    这是C语言的算法 得出的值是正确的。  不太懂C语言- -
     void data_prepare(){
     
     
    // UART_receive_buf(R_Data);//memcpy  --mem copy
    buff_pos=0; 
     
    Rad.object_id=R_Data[0]>>2;//  6bit
    Rad.length=((R_Data[0]&0x03)<<6)|((R_Data[1]&0xfc)>>2);//8bit
    Rad.speed_y=((R_Data[1]&0x03)<<9)|(R_Data[2]<<1)|((R_Data[3]&0x80)>>7);//11bit
    Rad.speed_x=((R_Data[3]&0x7f)<<4)|((R_Data[4]&0xf0)>>4);//11bit
    Rad.y_point=((R_Data[4]&0x0f)<<10)|(R_Data[5]<<2)|((R_Data[6]&0xc0)>>6);//14bit
    Rad.x_point=((R_Data[6]&0x3f)<<8)|R_Data[7];//14bit

    if((FeatureMeg[7]&0x02)==0){
    //FeatureMeg 1
    statis.Avspeed=FeatureMeg[0]<<8 | FeatureMeg[1];
    statis.speed85=FeatureMeg[2]<<2 | (FeatureMeg[3]&0xc0);
    statis.headway=FeatureMeg[4]<<9 |(FeatureMeg[5]<<1)|(FeatureMeg[6]&0x80);
    statis.lane=(FeatureMeg[6]>>4)&0x07;
    statis.measureline=(FeatureMeg[6]&0x03)>>2;
    }
    else{
    //FeatureMeg 2
    statis.Occupancy=FeatureMeg[0]<<6 | FeatureMeg[1]>>2;
    statis.Volume=(FeatureMeg[1]&0x03)<<12 | (FeatureMeg[2]<<4)| ((FeatureMeg[3]&0xf0)>>4);
    statis.VehicleClass=FeatureMeg[3] & 0x0f;
    statis.Gap=FeatureMeg[4]<<9 |(FeatureMeg[5]<<1)|(FeatureMeg[6]&0x80);
    }
    }
    //static void data_calc(){
    void data_calc(){
    int ID;
    float Length;
    float X_Speed,Y_Speed;
    float X_Point,Y_Point;
    //
    float Avspeed;
    int speed85,lane,measureline;
    long headway;
    //
    //?′ê±êy?Y????
    ID=Rad.object_id;
    Length=Rad.length * 0.2;
    X_Point=(Rad.x_point - 8192) * 0.064;
    Y_Point=(Rad.y_point - 8192) * 0.064;
    X_Speed=(Rad.speed_x - 1024) * 0.1;
    Y_Speed=(Rad.speed_y - 1024) * 0.1;
    //í3??êy?Y????
    Avspeed=(statis.Avspeed-32767) * 0.01;
    speed85=(statis.speed85-300);
    headway=statis.headway * 0.028;
    lane=statis.lane;
    measureline=statis.measureline;
      printf("ID=%d\n",ID);
    printf("Length= %4.2f m\n",Length);
    printf("X_Speed= %4.2f m/s\n",X_Speed);
    printf("Y_Speed= %4.2f m/s \n",Y_Speed);
    printf("X_Point= %4.2f m\n",X_Point);
    printf("Y_Point= %4.2f m\n",Y_Point);}
      

  3.   


    C语言和Java都是通过移位来实现的
      

  4.   

    C语言,Java都是从高位到低位的转换的,但是C#貌似是相反的,所以得反转一下再处理
      

  5.   

    看下这个样子和C的代码结果一致不,C#这边的位移和逻辑运算和C没什么区别,一般都能移植的。你那段代码不对是因为this.bits = new BitArray(bytes);的时候每一个byte里的二进制位被反向了。internal class Program
    {
        private static void Main(string[] args)
        {
            string temp = "58.29.FE.C0.A8.12.64.57";
            byte[] bytes = Hex2ByteArr(temp);
            MyData data = new MyData(bytes);
        }    public static byte[] Hex2ByteArr(string hexStr)
        {
            return hexStr.Split('.').Select(h => Convert.ToByte(h, 16)).ToArray();
        }
    }internal class MyData
    {
        public MyData(byte[] bytes)
        {
            if (bytes == null || bytes.Length != 8)
                throw new ArgumentException("must be an array of 8 bytes");        var object_Id = bytes[0] >> 2;//  6bit
            var length = ((bytes[0] & 0x03) << 6) | ((bytes[1] & 0xfc) >> 2);//8bit
            var speed_y = ((bytes[1] & 0x03) << 9) | (bytes[2] << 1) | ((bytes[3] & 0x80) >> 7);//11bit
            var speed_x = ((bytes[3] & 0x7f) << 4) | ((bytes[4] & 0xf0) >> 4);//11bit
            var y_point = ((bytes[4] & 0x0f) << 10) | (bytes[5] << 2) | ((bytes[6] & 0xc0) >> 6);//14bit
            var x_point = ((bytes[6] & 0x3f) << 8) | bytes[7];//14bit           ObjectId = object_Id;
            ObjectLength = length * 0.2f;
            RangeX = (x_point - 8192) * 0.064f;
            RangeY = (y_point - 8192) * 0.064f;
            VelocityX = (speed_x - 1024) * 0.1f;
            VelocityY = (speed_y - 1024) * 0.1f;
        }    public int ObjectId { get; set; }
        public float ObjectLength { get; set; }
        public float VelocityY { get; set; }
        public float VelocityX { get; set; }
        public float RangeY { get; set; }
        public float RangeX { get; set; }
    }