基于C语言的CRC编码与解码的实现
实验目的
-
设置一个d位的数据D, r+1位的多项式G,编写程序生成CRC码,并把此CRC码 作为数据帧进行传送。
-
编写两个子程序,分别实现CRC编码和CRC解码,在主函数中对子程序进行调用。 解码子程序应能根据解码情况判断出接收到的数据帧是否出错,并给出提示。
-
要求分别以正确和错误的数据来检验此检错程序。
实验原理
CRC检验原理实际上就是在一个p位二进制数据序列之后附加一个r位二进制检验码(序列),从而构成一个总长为n=p+r位的二进制序列;附加在数据序列之后的这个检验码与数据序列的内容之间存在着某种特定的关系。如果因干扰等原因使数据序列中的某一位或某些位发生错误,这种特定关系就会被破坏。因此,通过检查这一关系,就可以实现对数据正确性的检验。
CRC校验码的计算
设信息字段为K位,校验字段为R位,则码字长度为N(N=K+R)。设双方事先约定了一个R次多项式g(x),则CRC码:V(x)= A(x) g(x) = x Rm(x) + r(x)
其中: m(x)
为K次信息多项式,r(x)为R-1次校验多项式。
这里r(x)对应的代码即为冗余码,加在原信息字段后即形成CRC码。
r(x)的计算方法为:在K位信息字段的后面添加R个0,再除以g(x)对应的代码序列,得到的余数即为r(x)对应的代码(应为R-1位;若不足,而在高位补0)。
计算实例
下面以一个例子来具体说明整个过程。现假设选择的CRC生成多项式为G(X)
= X4 + X3 + 1,要求出二进制序列10110011的CRC校验码。具体的计算过程:
①首先把生成多项式转换成二进制数,由G(X)= X4 + X3 + 1可以知道:它一共是5位(总位数等于最高位的幂次加1,即4+1=5),然后根据多项式各项的含义(多项式只列出二进制值为1的位,也就是这个二进制的第4位、第3位、第0位的二进制均为1,其它位均为0)很快就可得到它的二进制比特串为11001。
② 因为生成多项式的位数为5,根据前面的介绍,得知CRC校验码的位数为4(校验码的位数比生成多项式的位数少1)。因为原数据帧10110011,在它后面再加4个0,得到101100110000,然后把这个数以“模2除法”方式除以生成多项式,得到的余数,即CRC校验码为0100,如图所示。
③把上步计算得到的CRC校验码0100替换原始帧101100110000后面的四个“0”,得到新帧101100110100。再把这个新帧发送到接收端。
④当以上新帧到达接收端后,接收端会把这个新帧再用上面选定的除数11001以“模2除法”方式去除,验证余数是否为0,如果为0,则证明该帧数据在传输过程中没有出现差错,否则出现了差错。
CRC编码算法实现
① 选择生成多项式G,其最高次方为r,即r+1位的二进制位串
②计算D·2r, 即在数据D后面补r个0,构成d+r位的位串
③按模2除法求(D·2r/G)的余数R,即:
④从D·2r中模2减去R,得到新的数据T,即加了CRC的帧
代码实现
CRC.h文件:
#define
_CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
int D[40], M[40],
G[40]; //M[]为生成器数据 G[]为原始数据 D[]为经处理除数/待解码数据
int m, n; //m为生成器长度 n为原始数据长度
void CRC(void); //CRC编码
void CRL(void); //CRC译码
void XOR (void); //模2除法
operation.c文件:
#include "CRC.h"
//CRC编码
void CRC(void) {
int i;
for(i = 0