目录

CRC 数据校验原理和应用

一、简介

  • CRC 循环冗余校验(Cyclic Redundancy Check)
    是一种根据网络数据包或计算机文件等数据产生简短固定位数校验码的一种信道编码技术,主要用来检测或校验数据传输或者保存后可能出现的错误。它是利用除法及余数的原理来作错误侦测的。CRC 成为计算机信息通信领域最为普遍的校验方式。常见应用有以太网/USB通信,压缩解压,视频编码,图像存储,磁盘读写等。

  • 常用的校验算法
    有奇偶校验、校验和、CRC,还有 LRC、BCC 等不常用的校验算法。

  • 常规数据帧格式
    帧头 + 长度 + 数据 + 校验

二、原理

点击展开内容

单纯谈 CRC 的 模 2 除法 其实并不困难,但实际计算中经常会遇到计算出来的结果和实际不一致的情况,这就需要我们知道几个组成部分或者说计算概念:多项式公式、多项式简记式、数据宽度、初始值、输入值反转、输出值反转、结果异或值、参数模型。

  1. 多项式公式
    对于 CRC 标准除数,一般使用多项式(或二项式)公式表示,例如除数 11011 的二项式为 X4+X3+X+1,X 的指数就代表了该 bit 位上的数据为 1。

  2. 多项式简记式(POLY)
    通过对 CRC 的基本了解我们知道,多项式的头部和首尾必定为 1,所以就把头部这个 1 给省略掉了,出现了一个叫简记式的东西,例如除数 11011 的简记式为 1011。对于CRC_16标准下 X16+X15+X2+1(0x18005)的 poly 值实际上是 8005,这里使用的就是简记式。

  3. 数据宽度(WIDTH)
    数据宽度指的就是 CRC 校验码的长度(二进制位数),知道了 CRC 的运算概念和多项式,就可以理解这个概念了,CRC 长度始终要比除数位数少1,与简记式长度是一致的。

  4. ① CRC 初始值(INIT)
    在一些标准中,规定了运算寄存先赋初始值,之后才会与原始数据进行运算。初始值位数要求与数据宽度一致。

  5. ② 输入值反转(REFIN - 是/否)
    输入值反转的意思是在计算之前先将二项式反转,之后一直用得到的新值和数据进行计算。如对于 X16+X15+X2+1(0x18005),其正向值为 1 1000 0000 0000 0101,反转值则为 1010 0000 0000 0001 1

  6. ③ 输出值反转(REFOUT - 是/否)
    输出值反转则是将与多项式运算后得到最终的 CRC 结果进行反转。例如计算得到的 CRC 值:0x97 = 1001 0111,如果 REFOUT 为 true,进行翻转之后为 1110 1001 = 0xE9。
    通常,输入值反转后的结果值也会是反转的,所以这两个选项一般是同向的,我们只有在在线CRC计算器中会看到自由选择正反转的情况存在。

  7. ④ 结果异或值(XOROUT)
    在所有运算得出的最后 CRC 结果值与[结果异或值]进行一次异或计算,得到的最终值才是我们需要的 CRC 校验码。结果值的位数要求与数据宽度一致。

  • 模2除法运算例子:设需要发送的信息为 1010001101,产生多项式为 110101(共6bit),则发送信息后面需要加5个0,然后对信息做模2除法运算,得余数为 01110。故实际需要发送的数据是 1010001101(信息)01110(校验)。
    ../img/20201212_01.jpg

以上内容主要解析 CRC 基本概念及原理,下面三图才是实际使用的 CRC 种类和运算过程:

../img/20201212_02.jpg
../img/20201212_03.jpg
../img/20201212_04.jpg

三、使用

点击展开内容

比如由网友whik分享的C语言版本:
https://gitee.com/whik/crc-lib-c
直接把“crcLib.c”“crcLib.h”加入工程使用即可。

1
2
3
4
5
6
 uint16_t crc16;
 uint32_t crc32;
 unsigned char datasrc[13] = {12, 214, 234, 3, 4, 5, 89, 21, 48, 92, 14, 7, 10}; //要运算的数据
 
 crc16 = crc16_usb(datasrc, sizeof(datasrc));    //计算CRC
 crc32 = crc32_mpeg_2(datasrc, sizeof(datasrc)); //计算CRC

补充说明:

  1. 为什么我们使用 STM32 处理器的 CRC 硬件运算器 与 crc32_mpeg_2()或 网上一些 CRC 计算工具计算的结果不一样?
    那是因为 STM32 处理器为小端数据处理方式,CRC 规则要求为大端数据处理方式;同时 STM32 处理器 CRC 硬件运算器以 4 字节对齐方式处理,最后几字节不足 4 字节需要用户补齐(如:补齐填充 0)。
  2. 标准的 CRC 函数的入口以及内部处理都是以字节作为基本处理单元,这样可避免出现大小端格式问题,所以用户调用计算函数时无须关心大小端问题。

四、工具

点击展开内容
  1. CRC 在线计算工具
  2. CRC 离线计算工具下载-CRC_Calc v0.1
  3. CRC 离线计算工具下载-格西CRC计算器