全网最详细的CRC讲解即计算

CRC

循环冗余码(Cyclic Redundancy Code, CRC)是一种用于校验通信链路上数字传输准确性的计算方法(通过某种数学运算来建立数据位和校验位(CRC)的约定关系的)。它是利用除法以及余数的原理来作错误侦测。
发送方: 使用某公式计算出被传送数据所含信息的一个值,并将此值 附在被传送数据后。
接收方: 对同一数据进行相同的计算,应该得到相同的结果。对比CRC结果。

数学背景

模二运算

模二运算,是一种二进制的四则运算,包括模二加(+)、模二减(-)、模二乘(x)、模二除(/) 四种二进制运算。与四则运算不同的是模二运算不考虑进位和借位.
模二除法

重点

  1. 模二加法和模二减法的结果是相同的,并且与异或(XOR)运算的结果是一致的。 异或运算可以代替模二加减运算。可用硬件XOR异或门硬件代替运算。
  2. 模二乘法可看作两个步骤, 可用AND与门代替运算。
    a. 第一步被乘数的位跟乘数进行与运算,再根据被乘数的阶进行左移被乘数的阶数位,被乘数的位数对应n个部分积。
    b. 部分积进行模二加法运算。
  3. 模二乘除法与普通乘除法一样演算,区别是模二除法的被除数部分的阶数与除数P的阶数相同时,进行部分XOR异或运算,得到商数和余数,将余数的阶数与除数P循环计算,直到余数的阶数小于R,这个余数就是附加的校验码。
    关注模二除法,因为它与CRC算法密切相关,它有三个性质:
  4. 当最后余数的位数小于除数位数时,除法停止。
  5. 当被除数的位数小于除数位数时,则商数为0,被除数就是余数。
  6. 只要被除数或部分余数的位数与除数一样多,且最高位为1,不管其他位是什么数,皆可商1。

二进制多项式

对任意的二进制数都构造与其对应的一个二进制系数多项式
例如:10011B,其对应的二进制系数多项式为P(X) = X^4 +X +1。
CRC算法中,对于二进制数都是以二进制系数多项式去描述的,。
在这里插入图片描述

CRC算法

CRC 算法的基本思想是将要传输数据后面填充N个0(既是传输数据信息左移N位)当做一个包含数据的多项式。将左移后的数据多项式 模二除以另一个生成多项式(Poly),得到的余数作为(CRC)校验数据附加到原数据后面。(模二除,CRC取余)
在这里插入图片描述
在这里插入图片描述

g(x)为校验码的生成多项式(上文中,除数的二级制多项式poly),不同的位数的CRC多项式,对应生成多项式的次幂不同,其纠错能力也不同。常见的标准多项式如下。
在这里插入图片描述

CRC-8算法为例,该算法生成多项式G(X)为在这里插入图片描述
.除数p(x)为0b10000 0111。

CRC算法参数模型

NAME:参数模型名称,决定了CRC位宽和POLY生成多项式。
WIDTH:宽度,即CRC位数。
POLY:生成项的简写,以16进制表示。例如:CRC-32即是0x04C11DB7,忽略了最高位的"1",即完整的生成项是0x104C11DB7。
INIT:这是计算CRC循环冗余码时,在数据后面预填充的预置值,十六进制表示。
REFIN:控制输入数据是否进行反转操作,True或False。若False,则输入数据的比特顺序反转,通常是将最高有效位(MSB)变为最低有效位(LSB)。
REFOUT:控制输出CRC校验值是否进行反转操作。在计算左移后数据多项式模二除以生成多项式后,余数(即CRC校验值)是否按位反转,True或False。
XOROUT:计算结果与此参数异或后得到最终的CRC值。

数据m(x)=0x31 ,CRC-8算法为例,该算法生成多项式G(X)为在这里插入图片描述
.除数p(x)为0b10000 0111。数据m(x)左移八位即x8m(x)=0x3100。 p(x) 模二除以x8m(x)的余数为0x97.

以CRC-16/DNP算法为例,
● 多项式公式G(X)为x16 + x13 + x12 + x11 + x10 + x8 + x6 + x5 + x2 + 1,除数为p(x)=0x13D65= 0b10011 1101 0110 0101。
● 数据m(x)为=0x31=0b0011 0001。由于CRC-16/DNP模型的输入数据反转,其值RefIn m(x) =0b1000 1100 =0x8C。数据m(x)左移16位即x16RefInm(x)=0x8C0000。
● x16RefIn m(x) = 0x8C0000模二除以p(x) = 0x13D65 的余数为r(x)=0b0101 1001 1011 0101=0x59b5.输出数据翻转RefOut r(x)=0b1010 1101 1001 1010 =0xAD9A。
● 结果异或值XorOut为0xFFFF,CRC-16/DNP算法的CRC值= 结果异或值XorOut 按位异或 输出数据翻转RefOut r(x),即RefOut r(x) ^ XorOut 。其值为0xAD9A ^ 0xFFFF = 0xE265。

传统CRC算法

实际应用时,发送方和接收方按以下方式通信:
发送方和接收方在通信前,约定好一个预设除数P(X)。P(X)首位和最后一位的系数必须为1. 以上面的CRC-8为例,多项式(poly)为X8 + X2 + X +1,对应除数P(X) = 10011.
发送方在发送前,将原始数据左移 除数P(X)的次幂的位,将其值进行模二除法运算生成余数F(X)(即CRC码),然后将其附加到原始数据后面一起T(X)发送给接收方。
接收方收到后将其T(X)模二除以约定好的除数P(X),当且仅当余数为0时接收方认为没有差错.

CRC校验码的编码方法是用待发送的二进制数据D(x)昧以生成多项式G(x),将最后的余数作为CRC校
验码。其实现步骤如下:
①没待发送的数据块是P位的二进制多项式D(x).生成多项式为i阶的G(x)。在数据块的末尾掭加i
个0.数据块的长度增加到m+i位.对应的二进制多项式为xiD(x).
②用生成多项式G(x)去除xiD(x),求得余数为阶数为i-1的二进制多项式R(x)。此二进制多项式R(x)
就是D(x)经过生成多项式G(x)编码的CRC校验码。
③用xiD(x)以模2的方式减去R(x),得到二进制多项式xiD’(x)。xiD’(x)就是包含了CRC校验码的
待发送字符串。

基于查表法的CRC算法

计算机操作单元一般为字节为单位,所以采用一个或者多个字节长度的CRC进行校验传递数据,提高CRC校验速度。 预先将CRC计算出来,并存到校验表里,且校验表存在 该行的首个CRC码与该列的首个CRC码的异或值 与他们交集的CRC码相同,每次调用CRC算法采用查表法替代移位计算发放,可提升计算速度。
以8bit 一个字节长度的CRC为例,有256种情况,对应余数有0~255种,将256种余数分别计算出来,按照顺序存放在一个包含256个入口地址的校验表中,然后对输入数据流采用查表来实现。

设置数据流为,在这里插入图片描述
数学表达式为
在这里插入图片描述

,其中⊕为异或运算符。生成多项式为G(x)17bit,则CRC码为CRC16,数学表示式为

CRC校验可以100%地检测出所有奇数个随机错误和长度小于或等于i(i为g(x)的阶数)的突发错误。
所以CRC的生成多项式的阶数越高,那么误判的概率就越小。

参考链接

【科普向】谁都能看懂的CRC(循环冗余校验)原理:https://blog.csdn.net/weixin_44256803/article/details/105805628
什么是CRC:https://info.support.huawei.com/info-finder/encyclopedia/zh/CRC.html
CRC校验查表法原理及实现(CRC-16): https://blog.csdn.net/AgonyRR/article/details/107810982
CRC循环冗余校验 查表算法的代码实现:https://blog.csdn.net/weixin_44256803/article/details/111794445
CRC在线计算: http://www.ip33.com/crc.html
[1]马群,王会燃.基于查表法的嵌入式系统CRC算法研究[J].软件导刊,2014,13(10):51-52.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/43804.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

客户关系管理怎么做?这4个工具一定要会用!

在商海浮沉中,每一位企业家和销售经理都深知,客户是企业生存与发展的基石。但如何有效管理这些宝贵的资源,让每一次互动都成为加深关系、促进成交的契机,却是一门艺术加科学的结合体。今天,咱们就来聊聊客户关系管理&a…

3SRB5016-ASEMI逆变箱专用3SRB5016

编辑:ll 3SRB5016-ASEMI逆变箱专用3SRB5016 型号:3SRB5016 品牌:ASEMI 封装:SGBJ-5 批号:2024 现货:50000 最大重复峰值反向电压:1600V 最大正向平均整流电流(Vdss):50A 功…

CNN -1 神经网络-概述

CNN -1 神经网络-概述 一:芯片科技发展介绍了解1> 芯片科技发展趋势2> 芯片使用领域3> 芯片介绍1. 神经网络芯片2. 神经网络处理单元NPU(Neural Processing Unit)二:神经网络1> 什么是神经网络2> 神经元3> 人工神经网络三:卷积神经网络(CNN)入门讲解一…

【Spring】springSecurity使用

一、基本配置 1. 引入依赖 在Spring Boot项目中&#xff0c;使用Spring Security首先需要引入相应的依赖。在pom.xml中添加spring-boot-starter-security依赖&#xff1a; <dependency> <groupId>org.springframework.boot</groupId> <artifactId>…

Kodcloud可道云安装与一键发布上线实现远程访问详细教程

文章目录 1.前言2. Kodcloud网站搭建2.1. Kodcloud下载和安装2.2 Kodcloud网页测试 3. cpolar内网穿透的安装和注册4. 本地网页发布4.1 Cpolar云端设置4.2 Cpolar本地设置 5. 公网访问测试6.结语 1.前言 本文主要为大家介绍一款国人自研的在线Web文件管理器可道云&#xff0c;…

唐刘:当 SaaS 爱上 TiDB(一)- 行业挑战与 TiDB 的应对之道

导读 在 TiDB 8.1 发布后&#xff0c;TiDB 展现了强大的支持 SaaS 业务的能力&#xff0c;成为 SaaS 业务数据库的优先选择之一。 本文为“当 SaaS 爱上 TiDB”系列文章的第一篇&#xff0c;系列文章将从技术原理和真实用户体验两个角度深入探讨 TiDB 在 SaaS 业务中的表现&a…

qt gridlayout 应用举例

Qt的GridLayout是一种非常有用的布局管理器&#xff0c;它允许你在一个网格中放置控件&#xff0c;这样你就可以创建出结构清晰、布局整齐的用户界面。下面是一个使用GridLayout的简单例子&#xff0c;展示了如何在一个窗口中放置几个按钮。 #include <QApplication> …

太速科技-3U VPX飞腾处理器刀片计算机

3U VPX飞腾处理器刀片计算机 一 、产品概述 该产品是一款基于国产飞腾FT2000 4核或腾锐D2000 8核的高性能3U VPX刀片式计算机。产品提供了4个x4 PCIe 3.0总线接口&#xff0c;同时可配置为1个x16或2个x8 PCIe3.0接口&#xff0c;因此具有很强的扩展性&#xff0c;极大…

agents 分类

一、分类 自动agent、半自动agent、领域、自定义sop和支持人为干预的agent。 先泼个冷水&#xff0c;目前这些agent项目都是实验品&#xff0c;发展还没有做知识库问答相关开源项目那么成熟&#xff0c; 二、全自动agent autoGPT、loopGPT、babyAGI 全自动agent就是人类不可…

sizeof()

一、题目 *struct T { char a; int *d; int b; int c:16; double e; }; T *p; 在64位系统以及64位编译器下&#xff0c;以下描述正确的是 A: sizeof 24 B: sizeof(p) 24 C: sizeof(p->a) 1 D: sizeof(p->e) 4 二、解析 p是一个指针&#xff0c;指针在32位机器上是…

GEE数据集——全球Ookla 5G 基站地图数据(Ookla 5G Map Data)

Ookla 5G Map Data Ookla 5G 地图数据 Ookla 5G Map™ 于 2019 年 5 月推出,旨在全面展示 5G 技术在全球的扩展情况。在推出之初,该地图突出显示了 17 个国家的 300 项部署,说明了这一变革性技术的初步推广情况。随着时间的推移,该地图已大幅增长,现在包含了来自 142 个…

实例演示Kafka-Stream消息流式处理流程及原理

以下结合案例&#xff1a;统计消息中单词出现次数&#xff0c;来测试并说明kafka消息流式处理的执行流程 Maven依赖 <dependencies><dependency><groupId>org.apache.kafka</groupId><artifactId>kafka-streams</artifactId><exclusio…

Java中的LinkedList(链表)(如果想知道Java中有关LinkedList的知识点,那么只看这一篇就足够了!)

前言&#xff1a;在Java编程语言中&#xff0c;Java集合框架提供了一组丰富的数据结构&#xff0c;以满足各种应用需求。其中&#xff0c;LinkedList作为一种常用的数据结构&#xff0c;具有独特的优势和广泛的应用场景。 ✨✨✨这里是秋刀鱼不做梦的BLOG ✨✨✨想要了解更多内…

linux radix-tree 基数树实现详解

radix tree&#xff0c;又称做基数树&#xff0c;是一种适合于构建key(index)与value(item)相关联的数据结构。内核中使用非常广泛。本文主要聚焦linux内核基数树的代码实现,大量注释过的代码。 radix-tree组织结构如下: 1、数据结构 /** The bottom two bits of the slot de…

如何通过JSON-RPC向以太坊链发送签名交易数据?

概述 在以太坊开发当中,通过web3.js、ethers.js等提供的API方法,都可以完成与以太坊的转账交易。那么如何通过以太坊JSON-RPC与以太坊进行交易呢? 在以太坊的JSON-RPC当中,有eth_sendRawTransaction这个方法,可以向以太坊网络提交预签名的交易广播。 curl https://main…

IDEA阿里云OSS实现文件上传·解决苍穹外卖图片回显

简单交代配置阿里云OSS的思路 1. 首先去阿里云开通一个OSS服务&#xff0c;配置好一个自己的Bucket 2. 在IDEA配置Bucket 3. 拷贝官网的OSS工具类代码 package com.sky.utils;import com.aliyun.oss.ClientException; import com.aliyun.oss.OSS; import com.aliyun.oss.OSS…

同三维T80001编码器(带屏)系列视频使用操作说明书:高清HDMI编码器,高清SDI编码器,4K超清HDMI编码器,双路4K超高清编码器

同三维T80001编码器&#xff08;带屏&#xff09;系列视频使用操作说明书&#xff1a;高清HDMI编码器&#xff0c;高清SDI编码器&#xff0c;4K超清HDMI编码器&#xff0c;双路4K超高清编码器 同三维T80001编码器&#xff08;带屏&#xff09;系列视频使用操作说明书&#xff1…

【C语言】printf、fprintf、sprintf,scanf、fscanf、sscanf的区别

目录 前言 printf、fprintf、sprintf printf fprintf sprintf scanf、fscanf、sscanf scanf fscanf sscanf 前言 这几个函数曾出现在面试中&#xff0c;因为函数名都差不多&#xff0c;所以很让人迷惑啊~ 下面我们逐个分析。 printf、fprintf、sprintf 这三个函数的主…

子任务:IT运维的精细化管理之道

在当今的企业运营中&#xff0c;信息技术已成为支撑业务发展的核心力量。根据Gartner的报告&#xff0c;IT服务管理&#xff08;ITSM&#xff09;的有效实施可以显著提升企业的运营效率&#xff0c;降低成本高达15%&#xff0c;同时提高服务交付速度和质量。随着业务的复杂性和…

电脑工具箱神器——uTools

AI视频生成&#xff1a;小说文案智能分镜智能识别角色和场景批量Ai绘图自动配音添加音乐一键合成视频https://aitools.jurilu.com/ 很多人脑子里都有一些一个月只用两三次的软件&#xff0c;这些软件就这样积满了灰尘&#xff0c;需要的时候又不知道去哪里找。uTools 完美地解决…