C#编程,CRC校验原理

article/2025/7/9 5:02:51

1.CRC简介

CRC全称循环冗余校验(Cyclic Redundancy Check, CRC),是通信领域数据传输技术中常用的检错方法,用于保证数据传输的可靠性。网上有关这方面的博客和资料很多,本文尽量简洁的梳理一下它的原理。后面还会结合自己的实践经验(不多),说一说如何使用verilog语言在FPGA中做CRC校验。感兴趣的朋友可以关注我后续的更新,一起交流学习!

CRC校验的基本思路是数据发送方发送数据之前,先生成一个CRC校验码,可以是单bit也可以是多bit,并附在有效数据末尾,以串行方式发送到接收方。接收方接收到数据后,进行CRC校验,根据校验结果就可以知道数据是否有误。

CRC校验码的生成:将有效数据扩展后作为被除数,使用一个指定的多项式作为除数,进行模二除法,得到的余数就是校验码。

数据接收方的CRC校验:将接受的数据(有效数据+CRC校验码)扩展后作为被除数,用指定的多项式作为除数,进行模二除法,得到余数为0,则表示校验正确。

2.CRC校验过程

2.1多项式选取

多项式关系到检查错误的可靠性,其中有一定的数学关系,这里不去深究,感兴趣的朋友可查阅通信原理和线性编码相关书籍。

多项式的常规表达式:G(x)=xn+x(n-1)…+1。例如G(x)=x5+x3+x2+1,G(x)=x6+x5+x1+1,G(x)=1。

也可以用2进制数表示,以便软件编程。多项式G(x)=x5+x3+x2+1,用2进制表示就是101101;多项式G(x)=x6+x5+x1+1,用2进制表示就是1100011。

有些资料里将多项式最高位的1省略,不过这里建议手动计算时保留这一位,免得出错。

通信领域有一些常用的多项式,如下表示所示,可根据通信方式选择,例如CRC-5/USB算法对应的是用于USB通信的CRC多项式。

2.2求余数(发送方)

求余目的是得到CRC校验码。首先将有效数据扩展n位作为被除数,n是多项式的最高次幂,例如前面的多项式101101最高次幂是5(比2进制位数少1),则有效数据扩展5位。然后用多项式的2进制数用模2除法去除被除数,得到的余数是CRC校验码。

先搞明白模2除法运算机制。

模2除法可以借助逻辑上的异或运算移位实现,例如被除数是2进制的10001111,除数是1010,则模2除法求余数的计算过程如下图所示,得到商是101,余数是111。可以看出,每次计算,除数最高位的“1”都要和被除数最高位的“1”对齐,然后进行异或运算。得到的余数位数不小于除数,则移位后再次对齐、计算,直到余数位数(从最高位的1开始算)小于除数位数。

再看CRC校验码的计算过程。

假如发送的有效数据是10101010(注意是2进制),我们把它作为被除数。这里选择CRC-5/USB校验算法,多项式是x5+x2+1,对应2进制形式是100101。

首先对有效数据扩展5bit,也就是在后面添5个0,得到被除数1010101000000。然后进行模2除法,最终得到5bit(比多项式少1bit)余数11000,这就是CRC校验码。

把上面得到的校验码附在有效数据后面,构成数据1010101011000,然后发送给接收方。

2.3求余数(接收方)

数据接收方对数据(包含校验码)求余数,计算过程与上述完全相同。最终得到的余数为0,才能说明数据传输无误。

假如接收的数据无误,这里写出来接收方的计算过程:

最终得到余数为0,证明数据无误。

3.CRC校验计算实例

关于CRC校验码的计算,上面繁琐的手算有助于了解计算过程,现在也有很多CRC计算工具,在线的和离线的都有。例如参考链接1的在线计算工具,可以用来验证手算或者自己的校验代码的计算结果。

这里用一个2byte数据做一次完整CRC校验,其中校验码的计算分别用手算和在线工具计算进行对比。

1)要发送的数据是0x8421,对应2进制为1000 0100 0010 0001;校验算法使用CRC-8,对应多项式是100000111。

2)手动计算,求校验码:有效数据扩展后为1000 0100 0010 0001 0000 0000,计算得CRC校验码为00000101,16进制为0x05。(算到眼疼~

3)在线工具计算校验码:得0x05,结果一致,说明手算无误。

4)在原始的发送数据后面附上校验码:得1000 0100 0010 0001 0000 0101,即0x842105。

4)手动计算,求接收方的校验结果:得0x00。

5)在线工具计算,求接收方的校验结果:得0x00,接收校验无误。

参考链接:

1、http://www.ip33.com/crc.html

2、https://www.cnblogs.com/liushui-sky/p/9962123.html

原文链接:https://www.cnblogs.com/y0011/p/14494809.html


http://chatgpt.dhexx.cn/article/aJMRYUdj.shtml

相关文章

LabVIEW实现CRC校验

目录 1、内部控件计算CRC校验 2、公式节点计算CRC校验 CRC(循环冗余校验),是一种根据网络数据包或计算机文件等数据产生简短固定位数校验码的一种信道编码技术,主要用来检测或校验数据传输或者保存后可能出现的错误。它是利用除…

CRC校验及C语言实现

摘自:CRC校验原理及其C语言实现 地址:https://blog.csdn.net/whik1194/article/details/108837493?spm1001.2014.3001.5502 目录 什么是校验算法CRC算法简介CRC参数模型CRC计算CRC校验CRC计算的C语言实现CRC计算工具总结 什么是校验算法 最近的工作中&…

SwitchHosts

SwitchHosts 官网:https://oldj.github.io/SwitchHosts/ 客户端支持 WindowsLinuxMac 功能支持 快速切换Hosts在线 hosts 方案Chrome浏览器Hosts实时生效 v3.3.12后将被支持,可暂时下载 https://github.com/CloverNet/SwitchHosts

Host服务

这也是看网上的例子自己跟着配置做的一个小demo,这里记录一下。 一、创建一个空的控制台应用程序 二、安装所需dll  1.Quartz     Install-Package Quartz -Version 2.3.3  2.Owin    Install-Package Owin -Version 1.0.0(这个暂时装上&…

Go get http 服务

阅读目录 package mainimport ("encoding/json""fmt""net/http" )type MirageIPResponse struct {Code string json:"code"MirageIP string json:"MirageIp" }func main() {// 定义处理函数handler : func(w http.Respo…

google host地址

2019独角兽企业重金招聘Python工程师标准>>> http://git.oschina.net/AlexKing/host 保持更新中。。。 亲测通过,如果无法使用可以联系我,再做更新调整。 转载于:https://my.oschina.net/u/260921/blog/506286

virtio,vhost 和vhost-user

virtio 在虚拟机中,可以通过qemu模拟e1000网卡,这样的经典网卡一般各种客户操作系统都会提供inbox驱动,所以从兼容性上来看,使用类似e1000的模拟网卡是非常一个不错的选择。 但是,e1000网卡上也包含了复杂的io端口&a…

GO的服务

1.go的安装 1.1 确认版本go version go version go1.20.4 darwin/amd64 可以看到是macos10.14版本。如果是m1 需要安装对应的版本 1.2 用vscode 进行编写go的简单例子 先进入vscode的界面,新建一个目录为godemo,里面就是go的例子的工作目录&#xff0…

Go Registry

实现微服务的服务注册中心,支持服务服务注册、接收心跳等。客户端实现基于注册中心的服务发现机制 微服务 微服务是一些协同工作的小而自治的服务 微服务主要分为六个部分组成 服务描述:类似服务的文档说明,简单但不可或缺。 比如&#xff1a…

Gogs私服搭建

1. Gogs介绍 官网地址:https://gogs.io 文档地址:https://gogs.io/docs Gogs,全称为Go Git Service,是一个基于 Go 语言开发的Git服务。它提供了一个类似于GitHub的界面和功能,允许您在自己的服务器上搭建私有的Git仓库…

vhost-user

1,virtqueue 图一 每个queue实际上是由tx/rx两个virtqueue组成的也就是说tx和rx的virtqueue是分开的,并没有共享。一个virtio net设备最多有多少个queue由后端vhost决定,但前端可以通过ethtool –L eth0 combined 16命令动态修改当前队列数&…

gohost -- go 开发的命令行hosts配置管理工具

前几天在微博上看到有人推荐了lazygit这个工具,让人眼前一亮,什么时候命令行也可以这么抢到了,?,调研了下,发现它使用了gocui,使用它可以做出来很多很炫的命令行工具。 现有的hosts工具里面也有switchosts…

Android studio占用C盘资源的解决方法

Android studio占用C盘资源的解决方法 Android Studio安装成功后会在系统盘用户目录下产生这几个文件夹 一、目录介绍 1、.android 是Android SDK生成的AVD(Android Virtual Device Manager)即模拟器存放路径 2、.AndroidStudio4.0(这里我安…

Minecraft神奇玩家不用键盘,行走全部靠骑猪最后通关MC

大家好,在Minecraft中有非常多的玩法,但是您听说过全程游戏不用键盘只用鼠标通关的玩法吗?也就是说在游戏中不能使用WSAD和空格按键通关!这听起来简直就是天方夜谈了! 在国外有位玩家叫做HeightAdvantage的玩家&#…

2021大树分享收集的网盘搜索站给兄弟们

聚合网盘搜索 https://www.chaonengso.com/ 某柠檬 https://www.moulem.com/ 史莱姆 http://www.slimego.cn/ 蓝菊花-城通网盘 http://www.lanjuhua.com google Drive搜索引擎 https://gezhong.vip/ 陈蛋蛋的宝藏库 http://www.chendandan.ys168.com/ xx资料网 https://www.xxu…

WPF窗体最小化到任务栏

WPF程序也可以很轻松的实现类似QQ那样最小化到任务栏的功能。 WindowState ws;WindowState wsl;NotifyIcon notifyIcon;

android ip格式化输入法,手机键盘还能这样玩?简单几步,让你的输入法萌动可人!...

玩手机,打字忙,输入法你用的是原厂、还是第三方?相信大多数网友跟我一样,换了新手机,会在第一时间安装自己习惯的第三方输入法。 相对而言,我更喜欢百度输入法,它的优势之一便是拥有种类丰富、脑…

渗透测试 ( 1 ) --- 相关术语、必备 工具、导航、全流程总结、入侵网站思路

From:https://zhuanlan.zhihu.com/p/401413938 渗透测试实战教学:https://www.zhihu.com/column/c_1334810805263515648 导航类网站: 渗透师网络安全从业者安全导航(速查小手册)​ 渗透师导航:https…

csgo原始输入开不开_CSGO职业哥参数配置:帅气猪猪JW

在CSGO游戏中,狙击手一直都扮演着团队中非常重要的位置,无论是进攻还是防守,利用狙击的远距击杀,不仅能够造成人数上面的领先,同时还可以打乱对方的战术安排部署,是真正的牵一发而动全身的关键位置。 那么,我们今天来介绍的是这么一位狙击手,CSGO圈中是这么评价他的:在…