• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

C# CRC8的实现(原创)

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

  最近由于要做一个串口控制类的上位机程序,需要用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:        }

转载于:https://www.cnblogs.com/humaoxiao/archive/2012/02/28/2371514.html


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
C#中的静态构造函数发布时间:2022-07-10
下一篇:
C#2008中调用非托管dll问题(序):参考材料发布时间:2022-07-10
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap