• C# CRC8的实现(原创)


      最近由于要做一个串口控制类的上位机程序,需要用CRC校验发送和接收的数据,于是上网搜相关内容,发现此类文章并不多,都是互相抄袭,没有自己的想法,我于是就自己仔细思考和实验了一下,发现并不难实现。

    CRC的原理:不准确的说就是用数据包除以CRC多项式。

    数据包不用说了,CRC多项式是什么呢?CRC多项式就是一个8bit的数,要求最高位是1,因此CRC16的CRC多项式就是16bit,CRC32的CRC多项式就是32bit。

    那么怎么除呢?就是把数据包和CRC多项式按位异或,一直异或到最后一位,最后结果就是CRC的值。

    废话不多讲,举一个例子看看:

    CRC多项式取0x85,即1000 0101

    数据包取byte型的数组,这里取三字节。{0x11,0x22,0x33}

    运算步骤如下:

    无标题

    最后的结果就是0100 0001即0x41。

    知道这个原理,代码就好写了,下面再贴上C#的源码:

       1: /// <summary>
       2:        /// CRC8CCITT式校验
       3:        /// </summary>
       4:        /// <param name="crcPoly">校验多项式 byte</param>
       5:        /// <param name="data">数据</param>
       6:        /// <returns>返回原数组+CRC校验字节</returns>
       7:        public int CRC8CCITT(byte crcPoly, byte[] data)
       8:        {
       9:            byte CRCPoly = 0x85;//CRC多项式,当做除数
      10:            byte[] Data = data;
      11:            byte CRCTempResult = 0x00;//CRC结果运算的得数,但不是最后的值
      12:            byte CRCResult = 0x00;//CRC结果运算最后的值
      13:  
      14:            CRCTempResult = (byte)(Data[0] ^ CRCPoly);
      15:  
      16:            for (int arrayLength = 1; arrayLength <= (data.Length-1); arrayLength++)
      17:            {
      18:                for (int i = 0; i < 8; i++)
      19:                {
      20:                    if ((CRCTempResult & 0x80) == 0x00)
      21:                    {
      22:                        CRCTempResult = (byte)(CRCTempResult << 1);
      23:                        CRCTempResult = (byte)(
      24:                                                            CRCTempResult |
      25:                                                            ((Data[arrayLength] & 0x80) == 0x80 ? 0x01 : 0x00)
      26:                                                          );
      27:                        Data[arrayLength] <<= 1;
      28:                    }
      29:                    else
      30:                    {
      31:                        CRCTempResult = (byte)(CRCTempResult ^ CRCPoly);
      32:                        i--;
      33:                    }
      34:                }
      35:            }
      36:            CRCResult = CRCTempResult;
      37:            return CRCResult;
      38:        }
  • 相关阅读:
    sql server不存在或访问被拒绝
    维护Sql Server中表的索引
    雷声大雨点小-参加江西省网站内容管理系统培训有感
    关于WINFORM中输入法的设置
    虚拟主机下asp.net 2.0的导航控件treeview,menu等出错。
    css背景图片不重复
    网上寻宝惊魂记
    一个不大注意的存储过程的小细节。
    css——之三行三列等高布局
    今天才发现ff不支持navigate。
  • 原文地址:https://www.cnblogs.com/humaoxiao/p/2371514.html
Copyright © 2020-2023  润新知