CRC16算法

循环冗余码校验英文名称为Cyclical Redundancy Check,简称CRC。它是利用除法及余数的原理来作错误侦测(Error Detecting)的。实际应用时,发送装置计算出CRC值并随数据一同发送给接收装置,接收装置对收到的数据重新计算CRC并与收到的CRC相比较,若两个CRC值不同,则说明数据通讯出现错误。

crc16使用过程:

1 初始化一个16为的寄存地址 用作初始化
2 遍历数据字节,从最高到最低
3 将数据字节与寄存器异或
4 对寄存器进行8次选代,每一次选代将寄存器右移一位
5 如果最低位位1,将寄存器与生产多项式0x8005异或,否则只进行右移操作
6 重复上述步骤直到遍历完所有的字节
7 最终寄存器的值就是crc16校检码

​
 public static byte[] CRCCalc(byte[] data)// []
 {
     //1 初始化一个16位的寄存器地址 用作初始值
     int crc = 0xffff;
 
     //2 遍历数据字节
     for (int i = 0; i < data.Length; i++)
     {
         //3 将数据字节与寄存器异或
         crc = crc ^ data[i];
         //4 对寄存器进行8次迭代,每一次迭代讲寄存器右移一位
         for (int j = 0; j < 8; j++)
         {
             int temp;
             temp = crc & 1;
             crc = crc >> 1;//每一次迭代将寄存器右移一位
             crc = crc & 0x7fff;
             //5 如果最低位位1,将寄存器与生成多项式0x8005异或,否则只进行右移操作
             if (temp == 1)
             {
                 crc = crc ^ 0xa001;
             }
             crc = crc & 0xffff;
         }
     }
     byte[] crc16 = new byte[2];// crc寄存器的高低为进行互换
     crc16[1] = (byte)((crc >> 8) & 0xff); //crc寄存器高八位变成了八低位
     crc16[0] = (byte)(crc & 0xff);// crc寄存器低八位变成了高低位
     return crc16;
 

 }
 /// 
 /// CRC校验,参数为空格或逗号间隔的字符串
 /// 
 /// 校验数据,逗号或空格间隔的16进制字符串(带有0x或0X也可以),逗号与空格不能混用
 /// 字节0是高8位,字节1是低8位
 public static byte[] CRCCalc(string data)
 {
     //分隔符是空格还是逗号进行分类,并去除输入字符串中的多余空格
     IEnumerable datac = data.Contains(",") ? data.Replace(" ", "").Replace("0x", "").Replace("0X", "").Trim().Split(',') : data.Replace("0x", "").Replace("0X", "").Split(' ').ToList().Where(u => u != "");
     List bytedata = new List();
     foreach (string str in datac)
     {
         bytedata.Add(byte.Parse(str, System.Globalization.NumberStyles.AllowHexSpecifier));
     }
     byte[] crcbuf = bytedata.ToArray();
     //crc计算赋初始值
     return CRCCalc(crcbuf);
 }


 
 /// 
 ///  CRC校验,截取data中的一段进行CRC16校验
 /// 
 /// 校验数据,字节数组
 /// 从头开始偏移几个byte
 /// 偏移后取几个字节byte
 /// 字节0是高8位,字节1是低8位
 public static byte[] CRCCalc(byte[] data, int offset, int length)
 {
     byte[] Tdata = data.Skip(offset).Take(length).ToArray();
     return CRCCalc(Tdata);
 }

​

你可能感兴趣的:(算法,c#)