FF2D00000002000010419000001AAAAA830702000A08140B11030303C0BA4048D0D76F180000B5000000033CFFFF2B00000002000010240000188AAAAA81200A08140B1B1D0303C011E6499096F51828003301000003F8FF 从版本号到数据字段的各个字节的不带进位累加和。计算时,先将校验和字段
填0x00,计算后,再将校验和写入该字段。
红色的是版本号
绿色的校验和

解决方案 »

  1.   

    int length=data_lenth;      //假定为数据长度
    byte checkcode=0;           //存储检验数据
    for(int i=5;i<lenth-2;i++)  //5为起始计算位置
    {
       checkcode+=Content[i];   //Content表示需要计算的字节数组
    }
    Content[lenth-2]=checkcode;大意如此
      

  2.   

    你确定你例子的校验和正确吗?
            private void button1_Click(object sender, EventArgs e)
            {
                //FF2D00000002000010419000001AAAAA830702000A08140B11030303C0BA4048D0D76F180000B5000000033CFF
                //FF2B00000002000010240000188AAAAA81200A08140B1B1D0303C011E6499096F51828003301000003F8FF
                //string strver = "FF2D00000002000010419000001AAAAA830702000A08140B11030303C0BA4048D0D76F180000B5000000033CFF";
                string strver = "FF2B00000002000010240000188AAAAA81200A08140B1B1D0303C011E6499096F51828003301000003F8FF";
                byte[] bver = new byte[strver.Length / 2];
                for (int i = 0; i < (strver.Length / 2); i++)
                {
                    //倒数第二个字节为0
                    if (i == (strver.Length / 2) - 2)
                    {
                        bver[i] = 0;
                    }
                    else
                    {
                        bver[i] = HexToByte(strver.Substring(i * 2, 2));
                    }
                }
                bool blfind = false;
                byte icheck = 0;
                for (int i = 0; i < bver.Length; i++)
                {
                    if (!blfind && bver[i] == 2)
                    {
                        blfind = true;
                        icheck = bver[i];
                    }
                    if (blfind)
                    {
                        icheck = (byte)(icheck + bver[i]);
                    }
                }
                //倒数第二位填写校验和
                bver[(strver.Length / 2) - 2] = (byte)(0xff & icheck);
                string str = ToHexString(bver);
            }
            private static byte HexToByte(string hex)
            {
                if (hex.Length > 2 || hex.Length <= 0)                throw new ArgumentException("hex must be 1 or 2 characters in length");            byte newByte = byte.Parse(hex, System.Globalization.NumberStyles.HexNumber);            return newByte;        }
            private static string ToHexString(byte[] bytes) 
            {
                string hexString = string.Empty;
                if (bytes != null)
                {
                    StringBuilder strB = new StringBuilder();                for (int i = 0; i < bytes.Length; i++)
                    {
                        strB.Append(bytes[i].ToString("X2"));
                    }
                    hexString = strB.ToString();
                }
                return hexString;
            }
      

  3.   

    最后icheck不用“与”了,当时icheck定义的是int所以用了“与”
    bver[(strver.Length / 2) - 2] =  icheck;
    str就是含校验码的返回值
      string str = ToHexString(bver);
      

  4.   

    修正一个地方
                for (int i = 0; i < bver.Length; i++)
                {
                    if (!blfind && bver[i] == 2)
                    {
                        blfind = true;
                        icheck = bver[i];
                    }
                    if (blfind)
                    {
                        icheck = (byte)(icheck + bver[i]);
                    }
                }
    应该为
                for (int i = 0; i < bver.Length; i++)
                {
                    if (!blfind && bver[i] == 2)
                    {
                        blfind = true;
                    }
                    if (blfind)
                    {
                        icheck = (byte)(icheck + bver[i]);
                    }
                }
    不然会重复加了个2循环次数是bver.Length和bver.Length-1没有区别,因为最后一个字节FF不会影响计算