当前位置:文档之家› CRC校验算法与实现程序

CRC校验算法与实现程序

//运行程序后 CRC_ParityBits[4]={0,0,1,0},证明了程序的正确性,对于其他 的生成多项式,只需要改变宏定义就可以了。
+(Shift_Register>>1); Shift_Register^=(CRC_Polynomial_Register*temp_long); } //parity for(i=0;i<CRC_Parity_Bits_Number;i++) { temp_long=Shift_Register&0x1; Shift_Register>>=1; Shift_Register^=(CRC_Polynomial_Register*temp_long); } //convert parity variable to binary data for(i=0;i<CRC_Parity_Bits_Number;i++) CRC_ParityBits[i]=((Shift_Register>>i)&0x1); } //////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////// unsigned int BinaryDataIn[11]={1,1,0,0,1,0,1}; unsigned int CRC_ParityBits[CRC_Parity_Bits_Number]; void main(void) { //generat CRC parity CRC_ParityBits_Generator(BinaryDataIn,7,CRC_ParityBits); //a break point put here }
码全部输入(包括左移 r 位后补上的 r 个零),最后存放在移位寄存器中的值就
是校验码(0010)了,即 b3=0,b2=1,b1=0,b0=0。
00001101110 10011/000011001010000
00000 00001 00000
00011 00000
00110 00000
01100 00000
名称
生成多项式
简记式
4
CRC-4
x +x+1
0x3
CRC-12
12 11 3
x +x +x +x+1
CRC-16
16 12 2
x +x +x +1
0x1005
CRC-ITU
16 12 5
x +x +x +1
0x1021
32 26 23
2
CRC-32 x +x +x +…+x +x+1 0x04C11DB7
CRC_Polynomial_Register<<=1; CRC_Polynomial_Register+=(((unsigned long)CRC_Generator_Polynomial>>i)&0x01); } //CRC loop for(i=0;i<BinaryDataIn_Length;i++) { temp_long=Shift_Register&0x1; Shift_Register=(((unsigned long)(BinaryDataIn[i]&0x1))<<(CRC_Parity_Bits_Number-1))
xr・P(x)除以
G(x),如图
1
所示,图中是按照模
2
和进
行的,即 0+0=0,1+0=1,1+1=0,0-1=1,仔细观察图 1 的计算规律,可以用图
2 所示的除法电路来实现,除法电路的主体由一组移位寄存器和模 2 加法器(异
或单元)组成,图 1 中加底纹的数字代表移位寄存器中暂时存放的值。当所有的
r
息多项式为 T(x)。发送方编码方法:将 P(x)乘以 x (即对应的二进制数序列左 移 r 位),再除以 G(x),所得余式即为 R(x),用公式表示为 T(x)=xr・P(x)+R(x);
接收方解码方法:将 T(x)除以 G(x),如果余数为 0,则说明传输中无错误发生,
否则说明传输有误。常见的生成多项式如表格 1 所示。
息码),以一定的规则产生一个校验用的 r 位监督码(CRC 码),附在原始信息后
边,构成一个新的二进制数序列共 k+r 位,然后发送出去。在接收端,根据信
息码和 CRC 码之间所遵循的规则进行检验,以确定传送中是否出错。这个规则,
在差错控制理论中称为“生成多项式”。
在代数编码理论中,将一个码组表示为一个多项式,码组中各码元当作多
6
5
4
3
2
1
0
项式的系数。例如:1100101 表示为:1・x +1・x +0・x +0・x +1・x +0・x +1・x ,
652
即 x +x +x +1。
设编码前原始信息多项式为 P(x),P(x)的最高次幂加 1 等于 k;生成多项
式为 G(x),G(x)的最高次幂等于 r;CRC 多项式为 R(x);编码后的带 CRC 的信
11001 10011
10100 10011
01111 00000
11110 10011
11010 10011
10010 10011
00010 00000
0010 图 1 竖式除法
1 input
b0
1
b1
0
b2
图 2 硬件除法
0
b3
C 语言程序:
#define CRC_Parity_Bits_Number 4 #define CRC_Generator_Polynomial 0x3 //CRC-4,g(x)=x4+x+1 void CRC_ParityBits_Generator(unsigned int*BinaryDataIn,unsigned int BinaryDataIn_Length,
32 28 27
86
CRC-32c x +x +x +…+x +x +1 0x1EDC6F41
应用举例 ITU G.704
IBM SDLC ISO HDLC,PPP-FCS ZIP,RAR,PPP-FCS
SCTP
表 1 常见生成多项式及其应用
说明:生成多项式的最高幂次项系数是固定的 1,故在简记式中,将最高的 1 统
CRC 校验算法与实现程序
作者:Water Shining 日期:2012-10-28
邮箱:snow1861@
基本原理:
CRC 的全称为 Cyclic Redundancy Check,中文名称为循环冗余校验。利用
CRC 进行检错的过程可简单描述为:在发送端根据要传送的 k 位二进制数序列(信
unsigned int*CRC_ParityBits) {
unsigned int i; unsigned long Shift_Register=0; unsigned long CRC_Polynomial_Register=0,temp_long; //CRC_Generator_Polynomial bit reverse for(i=0;i<CRC_Parity_Bits_Number;i++) {
一去掉了,如 04C11DB7,实际上是 104C11DB7。
举例说明:设需要编码的二进制数序列(信息码)为 1100101,共 k=7 个 bit,
生成多项式为
10011ቤተ መጻሕፍቲ ባይዱ即
r=4,也就是
652
P(x)=x +x +x +1,G(x)=
x4+x+1,xr・P(x)=
10 9 6 4
x +x +x +x ,下面计算
相关主题