云南大学软件学院计网实验9.doc_第1页
云南大学软件学院计网实验9.doc_第2页
云南大学软件学院计网实验9.doc_第3页
云南大学软件学院计网实验9.doc_第4页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

云南大学软件学院实 验 报 告课程: 计算机网络原理实验 任课教师: 姓名: 学号: 专业: 成绩: 实验九、链路层实验基于CRC编码的检错程序的实现实验报告一、实验目的1、通过实验,掌握CRC编码和解码的原理。2、掌握基于CRC编码的差错检测技术。二、实验指导现在计算机网络广泛采用的差错检测技术是基于CRC(cyclic redundancy check)循环冗余检测编码,CRC也称为多项式编码(polynomial code),CRC算法非常容易用硬件实现。CRC编码算法实现:1、选择生成多项式G,其最高次方为r,即r+1位的二进制位串2、计算D2r, 即在数据D后面补r个0,构成d+r位的位串3、按模2除法求(D2r/G)的余数R,即:4、从D2r中模2减去R,得到新的数据T,即加了CRC的帧三、实验要求 1、设置一个d位的数据D,r+1位的多项式G,生成CRC码,并把此CRC码作为数据帧进行传送。2、编写两个子程序,分别实现CRC编码和CRC解码,在主函数中对子程序进行调用。解码子程序应能根据解码情况判断出接收到的数据帧是否出错,并给出提示。3、要求分别以正确和错误的数据来检验此检错程序。4、将编写程序的源代码加必要注释和程序运行结果一起填入实验报告中。提示:1、编写程序时数据直接用二进制数,可能用到位操作符(异或)和(左移)。2、在设置错误的编码时,错误位数最好不要超过r+1位。实现代码:#include#include/定义全局变量int DR32; /用于储存循环冗余编码CRC;int REC32; /用于储存用户接收到的编码;int length; /用于模2除法中余数的长度;int lengthDR; /发送数据的长度;int lengthREC;/接收方接受到数据的长度;int D32; /用于接收用户要发送的数据;int R3; /储存3位余数的数组;int G4; /用于储存4位生成器; void char_binary(char *a,int *b) /将接收到的字符转换为数值; for(int i=0;istrlen(a);i+) bi=ai-48;void remainder(int d,int g) /求3位余数函数,其中包含模2除法的实现; /其中d为待求余数的数组,g为生成器数组; int y4; int j; /用于定位异或不为0的起位置; int d_coplength; for(int i=0;ilength;i+) d_copi=di; /将数组d复制到数组d_cop; for(int i=0;i4;i+) if(d_copigi=1) j=i; /找到异或结果不为0的起始位置; break; else j=4; /前4位恰好除尽,余数为0; int m=j; /将j复制到m,做标记,以防其值改变; for(int i=0;i4-j;i+) di=d_copmgm; /将异或后的结果放入原数组中; m+; length=length-j; /数组的长度减少j; int n=4; for(int i=4-j;i=4) remainder(d,g);/递归实现循环四位异或直至不足四位推出循环;/以下为实现返回3位余数; if(length=3) /3位余数 for(int i=0;i3;i+) Ri=di;else if(length=2) /2位余数R0=0;R1=d0;R2=d1;else if(length=1) /1位余数R0=R1=0;R2=d0;else if(length=0) /0位余数 R0=R1=R2=0;void decoded(int a,int b) /解码,看接收到数据是否正确,返回相应状态 /其中a为待解码的数组,b为生成器数组;remainder(a,b);if(R0=R1=R2=0) /3位余数为0,即除尽; printf(接收到的数据正确!n); else /未除尽; printf(接收到的数据错误!n);int main() char DC32; char GC4; char RECC32; int length_bu; printf(请输入数据:n); scanf(%s,DC); lengthDR = strlen(DC)+3; /获取发送数据的长度; char_binary(DC,D); printf(4位生成码:n); scanf(%s,GC); char_binary(GC,G); for(int i=lengthDR-3;ilengthDR;i+) /左移3位,实现D后加3位0; Di=0; for(int i=0;ilengthDR-3;i+) DRi=Di; length=lengthDR; /实现数据的传递; remainder(D,G); /调用求3位余数函数; DRlengthDR-3=R0; /将余数添于原数据之后,形成CRC编码; DRlengthDR-2=R1; DRlengthDR-1=R2; printf(得到编码后数据:n);for(int i=0;ilengthDR;i+) printf(%d,DRi); printf(n); printf(请输入接收数据:n); scanf(%s,RECC); lengthREC=strlen(

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论