实验九基于CRC编码的检错程序的实现.doc
云南大学软件学院实 验 报 告课程 计算机网络原理实验 任课教师 刘春花,刘宇 姓名 学号 专业 成绩 实验九、链路层实验基于 CRC 编码的检错程序的实现实验报告一、实验目的1、通过实验,掌握 CRC 编码和解码的原理。2、掌握基于 CRC 编码的差错检测技术。二、实验指导现在计算机网络广泛采用的差错检测技术是基于 CRC(cyclic redundancy check)循环冗余检测编码,CRC 也称为多项式编码(polynomial code) ,CRC算法非常容易用硬件实现。CRC 编码操作如下对给定的数据 D,发送者选择 r 个附加位,追加到 D 的末尾,形成 dr 位的新位型,该位型正好能被 G 模 2 除尽。其中,G 称为生成器。CRC 编码算法实现1、选择生成多项式 G,其最高次方为 r,即 r1 位的二进制位串2、计算 D2r, 即在数据 D 后面补 r 个 0,构成 dr 位的位串3、按模 2 除法求(D2 r/G)的余数 R,即4、从 D2r中模 2 减去 R,得到新的数据 T,即加了 CRC 的帧三、实验要求 1、设置一个 d 位的数据 D,r1 位的多项式 G,生成 CRC 码,并把此 CRC 码作为数据帧进行传送。2、编写两个子程序,分别实现 CRC 编码和 CRC 解码,在主函数中对子程序进行调用。解码子程序应能根据解码情况判断出接收到的数据帧是否出错,并给出提示。3、要求分别以正确和错误的数据来检验此检错程序。4、将编写程序的源代码加必要注释和程序运行结果一起填入实验报告中。提示1、编写程序时数据直接用二进制数,可能用到位操作符异或和include void crcint A,int G, int x,int n编码程序int i,j,k;printf“ntt“;for k0;kx-1;kprintf“ d“,Ak; 输出补后的数for i0;ix-n1;iif Ai1 当首位为时进行异或for j0;jn-1;jif AijGjAij0; 异或运算,相同为,不同为else Aij1;printf“ntt“; 输出每次异或后的结果for k0;kx-1;kprintf“ d“,Ak; 输出余数void crlint M,int A,int m,int n检验解码程序int k0,i;fori0;im-1;iifMiAiprintf“nnt 第d 位出现错误n“,i1;k;ifk0printf“nnt 数据完全正确n“;void main int m,n;int A20,M20,G20,i,j;printf“ntn“;printf“nnt 请输入生成器的长度 m“;scanf“d“,printf“nnt 请输入原始数据的长度 n“;scanf“d“,printf“nnt 请输入生成器“;for i0;im-1;iscanf“d“,printf“nnt 请输入原始数据“;for j0;jn-1;jscanf“d“,for i0;im-1;iAiMi;for im;imn-2;iAi0; 对被除数进行补crcA,G,mn-1,n; 调用异或函数for i0;im-1;iAiAiMi;printf “nnt 结果为“;for i0;imn-2;iprintf “d“,Ai;int a;printf“nnt 是否继续 1/21 代表 yes,2 代表 no “;printf“ntn“;scanf“d“,getchar;ifa1 继续system“cls“;printf“ntn“;printf“nnt 请输入需要解码的数据“;for i0;im-1;iscanf“d“,crlM,A,m,n;printf“ntn“;elsesystem“cls“;printf“ntn“;printf“ntt*按任意键退出n“;printf“ntn“;getchar;exit0;