海明码的通信校验软件设计课程设计报告.doc_第1页
海明码的通信校验软件设计课程设计报告.doc_第2页
海明码的通信校验软件设计课程设计报告.doc_第3页
海明码的通信校验软件设计课程设计报告.doc_第4页
海明码的通信校验软件设计课程设计报告.doc_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

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

文档简介

海明码的通信校验软件设计通信 班、 、 ;指导老师:王国才1、 设计题目题目:海明码的通信校验软件设计设计要求:环境为Windows2000/XP/7;编程语言为C;信息交换内容为文本文件;通信传输方式通过共享文件实现。功能要求:能在两台计算机机上运行程序,一台产生海明码,另一台校验纠错。(信息位4位,冗余位3位,文件中字符采用8位)2、 相关工作1. 海明码的概念当计算机存储或移动数据时,可能会产生数据位错误,这时可以利用海明码来检测并纠错,简单的说,海明码是一个错误校验码码集,由Bell实验室的R.W.Hamming发明,因此定名为海明码(汉明码)。与其他的错误校验码类似,汉明码也利用了奇偶校验位的概念,通过在数据位后面增加一些比特,可以验证数据的有效性。利用一个以上的校验位,汉明码不仅可以验证数据是否有效,还能在数据出错的情况下指明错误位置。它是在k位的信息位中,增加r位冗余位,构成一个n=k+r位的码字。如果校验位有r位,那么r个校验位就有个状态,其中一个状态指出“没有发生错误”,其余的个状态指出有错误时错误发生在哪一位(包括k个信息位和r个冗余位),所以必须满足不等式。即:或。2. 海明码的原理在数据中间加入几个校验码,码距均匀拉大,将数据的每个二进制位分配在几个奇偶校验组里,当某一位出错,会引起几个校验位的值发生变化。进行奇偶校验的方法是先计算数据中1的个数,通过增加一个0或1(称为校验位),使1的个数变为奇数(奇校验)或偶数(偶校验)。例如,数据1101总共是4个比特位,包括3个1,1的数目是奇数,因此,如果是偶校验,那么增加的校验位就是一个1,反之,增加一个0作为校验位。通过“异或”运算来实现偶校验,“同或”运算来实现奇校验。单个比特位的错误可以通过计算1的数目是否正确来检测出来,如果1的数目错误,说明有一个比特位出错,这表示数据在传输过程中受到噪音影响而出错。利用更多的校验位,汉明码可以检测两位码错,每一位的检错都通过数据中不同的位组合来计算出来。 海明码的编码规则: 1) 校验位被分配在编码后码字的第位置上;2) 校验位所校验的是从第个位置开始,校验i位,然后跳位不校验;3) 海明码中的每一位都被多个校验位所校验,被校验的位置是所有校验这位的校验位位置序号之和。3. 例题分析下面结合本文所设计的题目,以例题来讲解汉明码是怎么编码的。假设信息位为1101,共4位,分别对应为d0,d1,d2,d3,因为,所以,4位信息位只需要3位校验位就够了。假设校验位为r0,r1,r2。信息位和校验位在码字中对应的位置如表1所示:表1码字C1C2C3C4C5C6C7信息位d0d1d2d3校验位r0r1r2校验位数值的确定(假设进行奇校验):;。所以进行编码之后的码字为1010101。如果要验证所接收的码字是否出错,则验证:;。如果P1,P2和P4都为0,则没有出错,否则,就说明码字在传输过程当中出现了错误。错误的位置为不为0的所有校验位之和。假设所接收的码字为1010111,计算P1=0,P2=1,P4=1,因为P1,P2和P4不全为0,所以接收出现错误。错误的位置为第(2+4=6)位,即第6位。纠错之后的码字为1010101,与原来编码之后的码字相同。3、 题目分析及其设计的详细方案设计题目乍一看很简单,就是设计一个汉明码的校验软件,能在两台计算机机上运行程序,一台产生海明码,另一台校验纠错。要求信息位4位,冗余位3位,文件中字符采用8位进行传输。但是仔细一想,这里面的工作还是很多的。首先说文件,这个文件里头是什么内容?只是简单的“0”和“1”?不。这个文件里面可以有字符、数字、特殊符号和汉字等。但是汉明码的编码只是对简单的“0”和“1”,这个问题怎么解决呢?我们知道字符,数字等信息都是以二进制的形式存储在计算机中的。所以,我们只要将文件中的信息读取出来,再转化为二进制进行编码处理。编码规则在上述相关工作中已经详细叙述。将文件中的字符转化为二进制,那也有8位,但是题目要求是4位,这个怎么办呢?很简单,一次处理4位就好了,先处理前4位,再处理后4位,分别对其进行编码。编码完成之后,我们要考虑的问题就是怎么进行文件传输了。这个很简单,我们只需要在计算机上找到所需要共享的文件夹,将其设置为共享就行了。在文件共享的过程中,可能会出错,就会导致所接收的信息错误,这可能会造成很严重的后果。这就是我们要对其进行编码的原因。收到编码后的文件,我们要对其进行校验,检查文件在传输的过程中是否出现错误。根据编码规则进行校验,看是否满足奇偶特性。如果满足,那么说明没有出错;否则,文件在传输过程中就出现了错误。汉明码有一定的纠错功能,当发现接收的文件有错误时,可以对其进行纠错。有关内容在相关工作中已经有详细叙述。之后,就是对已接收的文件进行译码,译码的对象也是“0”和“1”,去掉冗余,得到数据位。因为编码是分开编的,所以译码的时候,需要将其组合起来再能得到完整的数据位。然后通过数据位,得到所对应的字符,并将其写入到一个新的文件中。最后要验证文件是否传输成功,只要将译码后的文件与原文件进行比较就可以了。如果一致,则成功,否则,失败。Server4、 设计的整体框架生成文件messageClient将message中的字符转化为二进制(每个字符转化为8位二进制)纠错并译码,得到前4位数据文 件 共 享纠错并译码,得到后4位数据文 件 共 享对前4位数据进行汉明码编码将前后4位数据组合对后4位数据进行汉明码编码还原出原来的字符与message比较验证传输是否出错?若一致,则没错!不一致,则有错!文件共享还原出原来的字符,并将其写入文件yima图1:整体框架图5、 设计过程以及结果和说明1. 初步设计所实现的功能是对4位二进制信息进行汉明码编码、译码、纠错。输入4位二进制数值,对其进行汉明码编码之后输出对应的汉明码。如输入1101,则输出1010101。调试结果如图2所示。图2:对4位二进制信息进行汉明码编码手动输入汉明码代替文件传输,然后对其进行校验和纠错,最后还原出原来的信息。如输入1010101,则表示没有出错,原来的信息位1101,如图3所示;如输入1010111,则第6位出现错误,纠正之后还原的信息为1101如图4所示。图3:正确接收并译码图4:纠错并译码2. 最终设计实现了最终功能。在两台计算机机上运行程序,一台产生海明码,另一台校验纠错。要求信息位4位,冗余位3位,文件中字符采用8位进行传输。欢迎界面。刚开始运行程序会出现welcome字样,然后回车之后,如果需要进入校验软件,则输入1,否则输入0退出。如图5所示。图5:欢迎界面创建message文件,输入任意字符,字数在50个字符以内,以“#”号键结束。输入的字符将写入命名为message的文本当中。如图6所示。 图6:创建message文本文件 然后将message中的内容转化为二进制,如“a”,在ASC中的编号为97,转化为二进制为01100001。如图7所示。图7:将字符转化为二进制 分别对前4位和后4位数据位进行汉明码编码。如01100001的前4位为0110,根据汉明码的编码规则,编码后为11001100,并将其编码后的代码写入文本文件hanmingma1中;后4位为0001,根据汉明码的编码规则,编码后为11010010,并将其编码后的代码写入文本文件hanmingma2中。如图8所示。 图8:分别处理前后4位数据位在校验端,读取hanmingma1中的代码进行前一个字节的处理;读取hanmingma2中的代码进行后一个字节的处理。将他们的数据位提取出来之后进行组合得到原来的数据信息,然后将其复原为字符信息。如hanmingma1中的代码11001100,对其进行校验:发现没有出错,故不需要纠错,提取其中数据位为0110。同样hanmingma2中的代码11010010,对其进行校验,发现没有出错,故不用进行纠错,提取其中的数据位0001。将前后两个字节的处理得到的数据位组合得到01100001,恢复成十进制数据为97,表示的字符为“a”。并将译码后得到的字符写入文本文件yima中。如图9所示。 图9:校验并纠错,并译码成原始信息 Message中的第一个字符处理完毕之后,开始处理message中的第二个字符,处理方法与处理第一位的方法一样。先将其转化为二进制代码,然后分别对前4位数据和后4位数据进行汉明码的编码、译码处理,译码之后将其组合成为8位数据,再化成十进制数据,得到对应的字符信息,并写入文件yima中。如图10所示。 图10:message中第二个字符的处理 是否需要向message中写入新的信息,如果需要,则输入1,不需要则输入0。假设需要向message中写入“c”,则输入1后按照提示操作。如图11所示。图11:继续向message中写入“c” 然后对message中新输入的字符信息“c”的处理。如图12所示。 图12:对message中新输入的字符的处理 如果你不想继续向message文本文件中输入新的信息,则在校验端输入“0”,表示不要再进行校验了。然后在发送端也输入“0”表示,不再输入新的信息。结束之后,在发送端读取message和yima中的内容,进行比较,验证传输是否出错。如图13所示。 图13:校验结束6、 总结通过两周时间的课程设计,我对汉明码有了更深一步的认识。在选题的时候,因为看到汉明码三个字,我就选定了这个设计题目。因为我学过嘛!选定题目之后,我初步计划是先弄清楚汉明码的相关知识,然后对生成汉明码和校验汉明码分别进行编程,最后在实现文件共享。我用了一天的时间来温习巩固汉明码的有关知识,它的概念,原理,编码规则,译码规则等。彻底弄清楚之后,我就开始编写程序,因为学过C+,所以,这一块对我来说很简单。虽然调试的时候,出现了一些小bug,但是经过我的改正,很快已经没有问题了。早早的完成了任务,我很兴奋。于是我早早的让王老师检查我的程序,本来以为这次的课程设计就这么结束了。谁知道你所共享的文件里面就只能写4位二进制信息,普通的文件就不说二进制,怎么着也不可能只有4位,所以,文本文件需要改进;你写一篇文章的时候,是不是经常需要更新,比如说插入,删除,修改等,那么你的共享文件如果出现这样的操作,还能继续进行校验吗,所以,这一部分需要改进;你怎么判断文件在共享的过程中没有出差错,在你的程序里头没有体现出来,所以,需要改进经过王老师这么一指导,我发现,我想的真的是太简单。我也经过了反思,我做这次课程设计没有怎么端正心态,我只是把它当做一次课程设计,做完了就是做完了,不会去想,我还有什么需要改进的,还有哪里是可以更加完美的。心里就只是想着:嗯,完整设计的基本要求就好了。没有像王老师一样,把它当成一种兴趣,一种挑战,一种自我提升,所以才会导致这样的错误发生。反思之后,我认真的改进了程序,改进之后的程序基本上比初步设计的程序好很多很多,当时也没想到一个简单的汉明码校验软件会被我做成这样。课设结束后,自己除了高兴,也很惊喜,我没想到自己会做的这么好。同时,我也在问自己,是刚开始的程序好,还是改进之后的程序好?自己当时怎么就没有想到呢?对人对事,都是需要用心的,就比如这次课程设计,我如果多用点心,不要怕麻烦,我肯定也会想到这些改进的地方。还有,不要怀疑自己的能力,这世上,只有你想不到的,没有你做不到的。对待一件事情或者一个事物,只要你用心,你可以想到很多很多,任何方面,每个细节。路漫漫其修远兮,吾将上下而求索。参考文献:施荣华,王国才.计算机通信网络技术及应用.中国水利水电出版社 2012年高传善等编著数据通信与计算机网络,高等教育出版社,2004年附录:附录一:发送端的源代码#include#include#includeint main() int i,k,j,y,a,m,dnum,rnum,g=0;char message100,message1100;int data8,data14,data24;int r13,r23; char code19,code29,c;printf(nn*Welcome*nnn);getchar();system(cls);printf(是否进入校验软件?n);printf(是:1n否:0n);scanf(%d,&m);getchar();system(cls);while(m)getchar(); printf(请输入需要校验的信息(小于50个字符并以“#”号键结束):n); for(k=0;k50;k+) messagek=getchar(); if(messagek=#) break; printf(nn输入的信息为:); for(j=0;jk;j+) printf(%c,messagej); getchar(); messagek=0; for(j=0;jk;j+) message1g=messagej; g+; printf(nn*汉明码的生成*nnn);getchar();for(j=0;j=0;a-) y=(int)messagej%2; messagej=(int)messagej/2; dataa=y; printf(n输出第%d位字符对应的二进制代码为:,j+1); for(a=0;a8;a+) printf(%d,dataa); getchar(); printf(n*前4位二进制的处理*nn); getchar(); dnum=0; rnum=0; i=0; printf(前4位的二进制代码为:); for(a=0;a4;a+) data1a=dataa; printf(%d,data1a); r10=data10+data11+data13;r10=r10%2; r11=data10+data12+data13; r11=r11%2; r12=data11+data12+data13; r12=r12%2; printf(n前4位的校验位为:); printf(%d%d%d,r10,r11,r12); for(a=1;a8;a+) if(a=pow(double)2,rnum) if(r1rnum=0) c=0; if(r1rnum=1) c=1; code1i=c; i+; rnum+; else if(data1dnum=0) c=0; if(data1dnum=1) c=1; code1i=c; i+; dnum+; code17=0;code18=0; printf(n前4位的汉明码为:); for(a=0;a8;a+) printf(%c,code1a); getchar(); printf(n*后4位二进制的处理*nn); getchar(); dnum=0;rnum=0; i=0; printf(后4位的二进制代码为:); for(a=0;a4;a+) data2a=dataa+4; printf(%d,data2a); r20=data20+data21+data23; r20=r20%2; r21=data20+data22+data23; r21=r21%2; r22=data21+data22+data23; r22=r22%2; printf(n后4位的校验位为:); printf(%d%d%d,r20,r21,r22); for(a=1;a8;a+) if(a=pow(double)2,rnum) if(r2rnum=0) c=0; if(r2rnum=1) c=1; code2i=c; i+; rnum+; else if(data2dnum=0) c=0; if(data2dnum=1) c=1; code2i=c; i+; dnum+; code27=0; code28=0; printf(n后4位的汉明码为:); for(a=0;a8;a+) printf(%c,code2a); getchar(); FILE *fp1,*fp2,*fp4; fp1=fopen(C:gongxianghanmingma1.txt,w); fp2=fopen(C:gongxianghanmingma2.txt,w); fp4=fopen(C:gongxiangcode.txt,a); fprintf(fp1,%s,code1); fprintf(fp2,%s,code2); fprintf(fp4,%s,code1); fprintf(fp4,%c,n); fprintf(fp4,%s,code2); fprintf(fp4,%c,n); fclose(fp1); fclose(fp2); fclose(fp4); getchar(); printf(n是否继续进入软件?n); printf(是:1n否:0n); scanf(%d,&m);system(cls); message1g=0;FILE *fp3; fp3=fopen(C:gongxiangmessage.txt,w); fprintf(fp3,%s,message1); fclose(fp3);char mes1100,mes100;FILE *fp6;fp6=fopen(C:gongxiangmessage.txt,r);fscanf(fp6,%s,mes1);fclose(fp6);for(k=0;k100;k+) mesk=mes1k; if(mes1k=#) break; mesk=0; char yima1100,yima100;FILE *fp5;fp5=fopen(C:gongxiangyima.txt,r);fscanf(fp5,%s,yima1);fclose(fp5);for(k=0;k100;k+) yimak=yima1k; if(yima1k=#) break; yimak=0; int f; printf(n*原来的信息为:%s,mes); printf(n译码后的信息为:%s,yima); for(f=0;fk;f+) if(mesf!=yimaf)&f!=k) break; if(f=k) printf(n因为译码前后的信息一致n所以传输没有错!n); if(f!=k) printf(n以为译码前后的信息不一致n所以传输有错!n); getchar();return 0;附录二:接收校验端的源代码#include#include#includeint main() int k,m,p,i,num; char code110,code210,c19,c29; char P16,P26; printf(nn*Welcome*nnn);getchar();system(cls);printf(是否进入校验软件?n);printf(是:1n否:0n);scanf(%d,&m);getchar();system(cls);while(m) printf(nn*前一个字节的处理*nn); p=0;i=0;num=0;FILE *fp1; fp1=fopen(C:gongxianghanmingma1.txt,r); fscanf(fp1,%s,c1); c18=0; for(k=1;k9;k+) code1k=c1k-1; code19=0; printf(输出前一半的汉明码:); for(k=1;k9;k+) printf(%c,code1k); printf(n前一半的校验(只能纠错一位):n); P11=code11+code13+code15+code17; P11=P11%2=0?0:1; P12=code12+code13+code16+code17; P12=P12%2=0?0:1; P13=0; P14=code14+code15+code16+code17; P14=P14%2=0?0:1; P15=0; printf(P1=%cn,P11); printf(P2=%cn,P12); printf(P4=%cn,P14); for(k=1;k5;k+) if(P1k=0) p=p+k; if(P1k!=0) num=num+k; if(p=10) printf(n因为P1,P2和P4都为0n所以没有出错!); if(p!=10) printf(n因为P1,P2和P4不全为0n); printf(所以接收的的码字有发生错误!n); printf(n所接收的码字中第%d位发生错误!n,num); printf(纠错之后的码字为:); for(k=1;k9;k+) if(k=num) if(code1k=0) code1k=1; else code1k=0; printf(%c,code1k); printf(n输出前一半的二进制代码:%c%c%c%c,code13,code15,code16,code17); printf(nnn*后一个字节的处理*nn); p=0;i=0;num=0;FILE *fp2; fp2=fopen(C:gongxianghanmingma2.txt,r); fscanf(fp2,%s,c2); c28=0; for(k=1;k9;k+) code2k=c2k-1; code29=0; printf(输出后一半汉明码:); for(k=1;k9;k+) printf(%c,code2k); printf(n后一半的校验(只能纠错一位):n); P21=code21+code23+code25+code27;P21=P21%2=0?0:1; P22=code22+code23+code26+code27;P22=P22%2=0?0:1; P23=0; P24=code24+code25+code

温馨提示

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

评论

0/150

提交评论