0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

CRC校验的计算过程

TopSemic嵌入式 来源:TopSemic嵌入式 作者:TopSemic嵌入式 2022-07-15 11:06 次阅读

据说刚过去的高考数学很难,小编当年上学时挺喜欢数学的,最近特意复习了一下CRC校验的计算过程。

CRC是众多校验方式中的一种,校验的目的是为了检测数据的正确性。在详细介绍CRC计算之前,我们先来看两个常见的较为简单点的校验:串口通信中的奇偶校验和身份证号码中的MOD 11-2校验。

先看奇偶校验,假设要发送8位数据10110101,奇校验是再加一位校验位,让这9位数据中的1的个数为奇数。

10110101->101101010 奇校验

偶校验是让这9位数据中1的个数为偶数。

10110101->101101011 偶校验

接收方收到数据后计算其奇偶性,如果不对,则说明数据传输中发生了错误。

奇偶校验优点是使用简单,缺点是检错率有限,只有奇数个数据位发生变化的错误能检测到,偶数个数据位变化的错误它检测不了。

最近拿着身份证去核酸检测的次数太多了,让我对身份证号码的组成产生了兴趣,尤其好奇的是为什么有的身份号号码最后一位是X。身份证号码总共18位,包括17位数字码和1位校验码。

1)1-6位是地址码,表示编码对象所在县。

2)7-14位是出生日期码,表示编码对象出生的年、月、日。

3)15-17位是顺序码,表示在同一地址码所标识的区域范围内,对同年、同月、同日出生的人编定的顺序号,顺序码的奇数分配给男性,偶数分配给女性。

4)校验码,用来检验身份证号码是否正确,采用MOD 11-2校验码系统。

5917011e-0360-11ed-ba43-dac502259ad0.png

校验的公式如下:

592dbd00-0360-11ed-ba43-dac502259ad0.png

简单来说它的校验规则是:连校验码一起,由从右到左逐位乘以2的n次方取模11并求和,对11的余数必须为1。

以一个身份证号码11010519491231002X为例,

5956ca42-0360-11ed-ba43-dac502259ad0.png

校验码计算如下:

1) 将前面的身份证号码17位数分别乘以不同的系数。从左到右的系数分别为:7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2

2) 将这17位数字和对应的系数各自相乘的结果相加7+9+0+5+0+20+2+9+24+27+7+18+30+5+0+0+4=167;

3) 用加出来的和167除以11,余数是2;

4) 余数2对应校验码是X;

看完上述计算方法之后,大家可以用自己的身份证号码试试。

该校验算法据说可以:

1) 如果某一位填错了,则校验算法可以检测出来。

2) 如果身份证号的相邻2位填反了,则校验算法可以检测出来。

这也是为什么要除以11而不是10的原因,其背后的数据理论推理已经超出了我的能力范畴,这里不再介绍了。

上面的两种校验和CRC校验没有什么关系,只是为了让大家对校验先有个感性的认识,下面来正式介绍CRC。

我在网上找了两个计算CRC的软件,输入同样的数据,选择同样的算法,得到的结果一样,

596866da-0360-11ed-ba43-dac502259ad0.png

59964730-0360-11ed-ba43-dac502259ad0.png

这两个软件的对应关系如下:

59bf738a-0360-11ed-ba43-dac502259ad0.png

把CRC Calculator Info 中的这几个参数弄明白,CRC的过程你也就清楚了

Name:算法的名称,比如对于16bit的CRC来说就有好多个名字,也就是虽然都是16 bit CRC,但是计算方式也有好多种。

59e31ace-0360-11ed-ba43-dac502259ad0.png

Width:指的CRC校验值的长度,通常有8bit,16bit,24bit,32bit等。

Poly:是多项式的值,以上面图中的CRC-8:x8+x2+x+1为例,它表示二进制为100000111,去掉最高位的1,十六进制表示就是0x07

Init: Init 的位数和Poly的位数相同,它的值为全0或者全F,当全为0时,在算法开始前对数据(这个数据是根据RefIn的值得到的)后面补上CRC位数个0后就可以进行后续计算了。当全为1时,表示在算法开始前对数据的前CRC位数(高位)先和对应位数个1进行异或(即:前CRC位数的值按位取反),再在后面补上CRC位数个0,才进行后续计算。

RefIn和Refout:它们要么全为False,要么全为True。

RefIn为False表示,输入的原始数据的每个字节的第7位作为最高有效位,第0位作为最低有效位,即正常计算即可

当RefIn为True时,输入的原始数据的每个字节需要做个逆序的处理,注意:针对的每个字节,而不是整个数据,以一个4字节的原始数据为例:

5a213ee4-0360-11ed-ba43-dac502259ad0.png

当Refout为False时,输出不做处理,当Refout为True,需要对输出数据做一次整个数据的逆序处理,注意:这里做的逆序和RefIn不同,它不是按字节逆序,而是整个逆序,以CRC-32为例来说明,最后的数据为32位,当Refout为True时,翻转如下:

5a4137b2-0360-11ed-ba43-dac502259ad0.png

XorOut:表示根据上面参数计算完后,和这个数再进行一次异或。

下面分析一下上面的结果0x79的由来:

1) 0x13 对应二进制为00010011

2)由于RefIn为False,所以0x13不做处理还是00010011

3) 因为Init为0x00,00010011后面加8个0即可,输入数据变为0001001100000000

4) 多项式为x8+x2+x+1 对应二进制100000111,将上述0001001100000000 除以该多项式对应的100000111

整个计算过程如下:

5a4d1546-0360-11ed-ba43-dac502259ad0.png

最后得到余数:01111001

5) 由于RefOuT为False,所以余数不变,还为01111001

6) 由于Xorout为0,表示不用再取反,所以最终的结果就是01111001,即十六进制0x79

算一个不过瘾,我们再来计算一个

5a5dd430-0360-11ed-ba43-dac502259ad0.png

这一次和上面唯一的不同是将初始值由原来的0x00换为了0xFF,这个例子就是给大家演示初始值到底什么意思.

下面分析一下上面的结果0x79的由来:

1) 0x13 对应二进制为00010011

2) 由于RefIn为False,所以0x13不做处理还是00010011

3) 因为Init为0xFF,00010011的高8位要先与0xFF异或,输入数据变为11101100,后面再加入8个0,变为 1110110000000000

4) 多项式为x8+x2+x+1 对应二进制100000111,将上述1110110000000000 除以该多项式对应的100000111,最后得到余数:10001010

5) 由于RefOuT为False,所以余数不变,还为10001010

6) 由于Xorout为0,表示不用再取反,所以最终的结果就是10001010,即十六进制0x8A

这个例子演示了初始值的含义,我们再看最后一个例子,这个例子演示了RefIn和RefOut为True的具体含义

5a70e9e4-0360-11ed-ba43-dac502259ad0.png

1) 0x13 对应二进制为00010011

2) 由于RefIn为True,所以0x13需要逆序一下得到11001000

3) 因为Init为0x00,所以11001000后面直接添加4个0即可,得到110010000000

4) 多项式为x4+x+1 对应二进制10011,将上述110010000000 除以10011,最后得到余数:0010

5) 由于RefOuT为True,所以余数要逆序变为0100

6) 由于Xorout为0,表示不用再取反,所以最终的结果就是0100

CRC每种参数模型的检错能力,同时CRC也可以纠错,这需要专业的数学计算,这也超出了我的能力,这里也不介绍了。

看完这些大家应该都清楚了CRC的计算,有些 MCU本身集成了硬件CRC模块,你只需要配置寄存器,就可以算出CRC结果了,或者也可以通过软件来实现,https://github.com/whik/crc-lib-c 有一个开源的代码可以用。不管哪种方法,了解下详细的计算过程还是有好处的。

CRC计算软件和github 软件代码下载如下:

https://cowtransfer.com/s/05d6adadea654c 或 打开【奶牛快传】cowtransfer.com 使用传输口令:diz36q 提取

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • crc
    crc
    +关注

    关注

    0

    文章

    191

    浏览量

    29195
  • 计算
    +关注

    关注

    2

    文章

    431

    浏览量

    38479
  • 校验
    +关注

    关注

    0

    文章

    39

    浏览量

    12561

原文标题:CRC校验怎么算?

文章出处:【微信号:TopSemic,微信公众号:TopSemic嵌入式】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    关于CRC校验的问题,求解答

    ,uint16_t Len )//指针指向的数据顺序影响校验结果,{//此计算过程计算指针指向的最低字节uint16_t CRC_Reg;uint8_t num;uint8_t Da
    发表于 04-06 17:33

    CC1310的CRC校验计算的问题,请问能否在Tx端计算CRC的值然后放在数据包的末尾当成CRC校验的字节?

    CRC校验的)Tx:CC115L、CC1310或其他,关闭CRC计算,给接收端发送一个数据包。一般结果:接收端显示CRC
    发表于 06-06 00:49

    CRC-16/Modbus校验计算

    CRC-16/Modbus校验计算输入进制字符串,输出校验计算
    发表于 09-11 14:44

    Modbus RTU CRC校验值怎么计算呢?

    Modbus RTU CRC校验详细步骤?CRC值怎么计算
    发表于 05-05 16:05

    40位以内任意长度的CRC计算校验的实现

    论述了40位以内任意长度的CRC计算校验在TMS320C5000系列DSP中的实现方法。运用该方法能实现任意信息长度的40位以内任意CRC码的计算
    发表于 05-05 20:31 1837次阅读
    40位以内任意长度的<b class='flag-5'>CRC</b><b class='flag-5'>计算</b>及<b class='flag-5'>校验</b>的实现

    CRC标准及计算过程

      标准   根据应用环境与习惯的不同,CRC又可分为以下几种标准:   ①CRC-12码;   ②CRC-16码;   ③CRC-CCITT码;   ④
    发表于 08-13 11:17 2422次阅读

    crc校验基本原理

    本内容介绍了crc校验基本原理,CRC几个基本概念,CRC码的生成步骤.CRC即循环冗余校验码(
    发表于 12-21 16:55 4536次阅读

    crc校验原理_怎样修复crc校验错误

    crc校验原理 利用CRC进行检错的过程可简单描述为:在发送端根据要传送的k位二进制码序列,以一定的规则产生一个校验用的r位监督码(
    发表于 09-05 09:26 3.4w次阅读
    <b class='flag-5'>crc</b><b class='flag-5'>校验</b>原理_怎样修复<b class='flag-5'>crc</b><b class='flag-5'>校验</b>错误

    crc校验错误_crc校验错误怎么解决

    CRC即循环冗余校验码(Cyclic Redundancy Check[1] ):是数据通信领域中最常用的一种查错校验码,其特征是信息字段和校验字段的长度可以任意选定。循环冗余检查(
    发表于 12-05 15:34 4.4w次阅读
    <b class='flag-5'>crc</b><b class='flag-5'>校验</b>错误_<b class='flag-5'>crc</b><b class='flag-5'>校验</b>错误怎么解决

    CRC计算工具CRC校验计算器应用程序免费下载

    本文档的主要内容详细介绍的是CRC计算工具CRC校验计算器应用程序免费下载。
    发表于 07-01 08:00 129次下载
    <b class='flag-5'>CRC</b><b class='flag-5'>计算</b>工具<b class='flag-5'>CRC</b><b class='flag-5'>校验</b>码<b class='flag-5'>计算</b>器应用程序免费下载

    CRC校验 、STM32中CRC计算单元、 CRC应用

    CRC校验、STM32中CRC计算单元、CRC应用
    的头像 发表于 03-04 13:54 5377次阅读

    CRC校验码并行计算的FPGA实现

    用软件实现 CRC 校验计算很难满足高速数据通信的要求 ,基于硬件的实现方法中 ,有串行经典算法 LFSR 电路 以及由软件算法推导出来的其它各种并行计算方法。以经典的LFSR 电路
    发表于 03-28 09:34 30次下载
    <b class='flag-5'>CRC</b><b class='flag-5'>校验</b>码并行<b class='flag-5'>计算</b>的FPGA实现

    CRC校验原理及实现

    作者:王超首发:电子电路开发学习目录前言CRC算法简介CRC计算CRC校验CRC
    发表于 01-26 17:37 28次下载
    <b class='flag-5'>CRC</b><b class='flag-5'>校验</b>原理及实现

    CRC循环冗余校验简介

    CRC 是Cyclic Redundancy Check的缩写,循环冗余校验,用于校验数据传输的完整性。一般情况下在数据发送前计算CRC
    的头像 发表于 04-24 13:04 3899次阅读
    <b class='flag-5'>CRC</b>循环冗余<b class='flag-5'>校验</b>简介

    工控常用LRC XOR累加和CRC校验工具校验码自动生成软件多计算方式

    CRC校验工具 校验码自动生成软件支持十几种CRC计算方式,包括MODBUS协议的CRC-16
    的头像 发表于 11-25 14:27 2556次阅读
    工控常用LRC XOR累加和<b class='flag-5'>CRC</b><b class='flag-5'>校验</b>工具<b class='flag-5'>校验</b>码自动生成软件多<b class='flag-5'>计算</b>方式