CRC校验算法及C#程序实现

CRC校验是一种用于验证数据传输正确性的方法,通过数据和生成多项式进行模2除法计算校验码。本文介绍了CRC的基本概念、计算过程,并提供了两种计算机算法的详细步骤,以及C#编程实现CRC校验的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

CRC校验可以运用于传输数据过程中的验证,发送端发送有效数据时,先根据有效数据和生成多项式(比如CCITT标准的多项式是X16+X12+X5+1)计算出CRC校验码,把CRC校验码加到有效数据后面一起发送;当接收数据时,取出前面有效数据部分,用同样生成多项式计算出CRC校验码,然后取出接收数据后面CRC校验码部分,对比两个校验码是否相同。如果相同,认为接收到的数据与发送的数据是一致的,传输正确;如果不同,认为传输数据出错。

CRC(循环冗余校验)算法主要是一个计算除法的过程。算法有两个输入值,第一个是输入的信号,这通常是一个很长的数据,作为被除数。第二个是一个与具体的CRC算法相关的多项式,称为生成多项式,用作除数。基本的计算过程是,两者作模2除法(本质上是对应位做异或运算),余数就是CRC校验码的结果。

I、基本算法(人工笔算):
以CRC16-CCITT为例进行说明,它的生成多项式是X16+X12+X5+1,CRC校验码为16位,生成多项式17位。假如数据流为4字节:BYTE[3]、BYTE[2]、BYTE[1]、BYTE[0];
数据流左移16位,相当于扩大256×256倍,再除以生成多项式0x11021,做不借位的除法运算(相当于按位异或),所得的余数就是CRC校验码。
发送时的数据流为6字节:BYTE[3]、BYTE[2]、BYTE[1]、BYTE[0]、CRC[1]、CRC[0];
II、计算机算法1(比特型算法):
1)将扩大后的数据流(6字节)高16位(BYTE[3]、BYTE[2])放入一个长度为16的寄存器;
2)如果寄存器的首位为1,将寄存器左移1位(寄存器的最低位从下一个字节获得),再与生成多项式的简记式异或;
否则仅将寄存器左移1位(寄存器的最低位从下一个字节获得);
3)重复第2步,直到数据流(6字节)全部移入寄存器;
4)寄存器中的值则为CRC校验码CRC[1]、CRC[0]。
III、计算机算法2(字节型算法):
字节型算法的一般描述为:本字节的CRC码,等于上一字节CRC码的低8位左移8位,与上一字节CRC右移8位同本字节异或后所得的CRC码异或。
字节型算法如下:
1)CRC寄存器组初始化为全"0"(0x0000)。(注意:CRC寄存器组初始化全为1时,最后CRC应取反。)
2)CRC寄存器组向左移8位,并保存到CRC寄存器组。
3)原CRC寄存器组高8位(右移8位)与数据字节进行异或运算,得出一个指向值表的索引。
4)索引所指的表值与CRC寄存器组做异或运算。
5)数据指针加1,如果数据没有全部处理完,则重复步骤2)。
6)得出CRC。

简单例子

下面用一个简单的例子来说明CRC算法的计算过程。输入信号是101111,生成多项式是1001(对应数学表达式为X3+1)。被除数后面需要补充3个0。即101111000对1001做模2除法运算,得到一个3位的余数010,这个就是CRC校验码。在上例中,余数为010。将余数附加到输入信号后面,即发送数据为101111010,取接收端接收到的数据的前六位对1001做模2除法运算,看看得到的CRC校验码是不是等于接收数据的后三位。如果是,传输正确,如果不是,传输错误。

4 C#程序代码

这是采用比特型算法编写的程序。

以下CRCVerifyLHY类中的GetCRC方法就是用来计算CRC校验码的,在Main函数中byte数组用来存放要传输的数据(注意:前面两个字节都初始为0,用来存放CRC校验码结果,真正要传输的数据从第三个字节开始)。这里简单地只传输一个字节的数据,如下面的157,可以先人工用笔算出一个CRC校验码,然后看程序的输出是否和人工算的一致,经本人验证,此算法程序应该是正确的。

using System;

using System.Collections.Generic;

using System.Text;

namespace CRCVerify

{

class CRCVerifyLHY

{

//dataStream数组中的dataStream[0]和dataStream[1]为CRC校验码的初始值,即0x0000。其他的数组元素即为要传输的信息码,cRC_16为生成多项式的简记式

//以CRC16-CCITT为例进行说明,CRC校验码为16位,生成多项式17位,其简记式实际是0x11021,

//但是生成多项式的最高位固定为1,故在简记式中忽略最高位1了,CRC16-CCITT的简记式就可以写为0x102

1、循环校验码(CRC码):是数据通信领域中最常用的一种差错校验码,其特征是信息字段和校验字段的长度可以任意选定。   2、生成CRC码的基本原理:任意一个由二进制位串组成的代码都可以和一个系数仅为‘0’和‘1’取值的多项式一一对应。例如:代码1010111对应的多项式为x6+x4+x2+x+1,而多项式为x5+x3+x2+x+1对应的代码101111。   3、CRC码集选择的原则:若设码字长度为N,信息字段为K位,校验字段为R位(N=K+R),则对于CRC码集中的任一码字,存在且仅存在一个R次多项式g(x),使得   V(x)=A(x)g(x)=xRm(x)+r(x);   其中: m(x)为K次信息多项式, r(x)为R-1次校验多项式,   g(x)称为生成多项式:   g(x)=g0+g1x+ g2x2+...+g(R-1)x(R-1)+gRxR   发送方通过指定的g(x)产生CRC码字,接收方则通过该g(x)来验证收到的CRC码字。   4、CRC校验码软件生成方:   借助于多项式,其余数为校验字段。   例如:信息字段代码为: 1011001;对应m(x)=x6+x4+x3+1   假设生成多项式为:g(x)=x4+x3+1;则对应g(x)的代码为: 11001   x4m(x)=x10+x8+x7+x4 对应的代码记为:10110010000;   采用多项式: 得余数为: 1010 (即校验字段为:1010)   发送方:发出的传输字段为: 1 0 1 1 0 0 1 1 0 10   信息字段 校验字段   接收方:使用相同的生成码进行校验:接收到的字段/生成码(二进制除)   如果能够除尽,则正确,
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值