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#的源码:

        /// <summary>
        /// CRC8CCITT式校验
        /// </summary>
        /// <param name="crcPoly">校验多项式 byte</param>
        /// <param name="data">数据</param>
        /// <returns>返回原数组+CRC校验字节</returns>

        public int CRC8CCITT(byte crcPoly, byte[] data)
        {

            byte CRCPoly = 0x85;//CRC多项式,当做除数
            byte[] Data = data;
            byte CRCTempResult = 0x00;//CRC结果运算的得数,但不是最后的值
            byte CRCResult = 0x00;//CRC结果运算最后的值

            CRCTempResult = (byte)(Data[0] ^ CRCPoly);

            for (int arrayLength = 1; arrayLength <= (data.Length - 1); arrayLength++)
            {
                for (int i = 0; i < 8; i++)
                {
                    if ((CRCTempResult & 0x80) == 0x00)

                    {
                        CRCTempResult = (byte)(CRCTempResult << 1);
                        CRCTempResult = (byte)(
                                                           CRCTempResult |
                                                           ((Data[arrayLength] & 0x80) == 0x80 ? 0x01 : 0x00)
                                                          );
                        Data[arrayLength] <<= 1;
                    }
                    else
                    {
                        CRCTempResult = (byte)(CRCTempResult ^ CRCPoly);
                        i--;
                    }
                }
            }
            CRCResult = CRCTempResult;
            return CRCResult;
        }

  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
CRC(循环冗余校验)是一种重要的线性分组码,用于实现差错控制。它具有检错和纠错能力强的特点,在计算机信息通信领域被广泛使用。CRC算法校验的检错能力极强,且检测成本较低,因此在对于编码器和电路的检测中使用较为广泛。从检错的正确性与速度、成本等方面,都比奇偶校验校验方式具有优势。因而,CRC成为计算机信息通信领域最为普遍的校验方式。CRC的原理是根据多项式得到CRC除数,通过对数据进行除法运算得到校验码。生成多项式是标准规定的,发送方和接收方必须事先商定一个生成多项式G(x),其高位和低位必须是1。CRC在数据存储、数据通信等领域都有广泛的应用,例如在读软盘上的文件、解压ZIP文件时,偶尔会碰到“Bad CRC”错误。\[1\]\[2\]\[3\] #### 引用[.reference_title] - *1* [CRC 循环冗余校验](https://blog.csdn.net/zhangduang_KHKW/article/details/121852304)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [循环冗余校验-CRC](https://blog.csdn.net/qq_43441284/article/details/124945020)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值