资源预览内容
第1页 / 共12页
第2页 / 共12页
第3页 / 共12页
第4页 / 共12页
第5页 / 共12页
第6页 / 共12页
第7页 / 共12页
第8页 / 共12页
第9页 / 共12页
第10页 / 共12页
亲,该文档总共12页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
计算机网络课程设计实验报告题目:计算校验和班级:2009级教育技术学一班作者: 郭建勋200930680106 林泽涛200930680113 张丽丽200930680127指导老师: 完成时间:2011年12月16日华南农业大学 信息学院目录1、题目概述31.1 题目:31.2 题目要求32、开发的基础知识32.1 计算校验和32.2 一些编码技术可以提高校验和的计算速度43、设计思路53.1 数据的输入方式53.2 校验和的计算54、程序流程图75、程序源代码86、开发过程117、程序运行情况118、总结128.1林泽涛的心得体会128.2郭建勋的心得体会121、题目概述1.1 题目:校验和的计算过程分为三个步骤:数据文件的输入,校验和的计算以及效验结果的输出。计算校验和应用最为普遍的是端循环进位法:将数据按一定数位进行累加,最高位的进位则循环加入最低位。待教研的数据按16位为一个单位相加,采用端循环进位,最后对所得16位的数据取反码。因为待教研的数据是以字节方式分隔的,所以为了方便,将16位的数据分成高8位和低8位分别处理。该算法的代码如下:endaroundcarry(int & highbyte, int & lowbyte)while(highbyte0xff|lowbyte0xff)lowbyte+=(highbyte8);highbyte=highbyte&0xff);highbyte+=(lowbyte8);lowbyte=lowbyte&0xff);1.2 题目要求课程设计要求:根据上面介绍的算法,编制程序为给定数据计算校验和。1)以命令行形式运行:check_sum infile其中check_sum为程序名,infile为输入数据文件名。2)输出:数据文件的校验和。2、开发的基础知识2.1 计算校验和有很多数学方法可以用来提高校验和的计算速度,下面我们将就此展开讨论。2.1.1 交换性与结合性因为校验和主要考虑被校验数据中所包含字节数量的是奇数还是偶数,所以校验和的计算可以以任意顺序进行,甚至可以把数据进行分组后再计算。例如,用A、B、C、D,Y,Z分别表示一系列八位组,用a,b这样形式的字节来表示a*256+b的整数,那么16位校验和就可以通过以下形式给出:A,B+C,D+Y,Z 1A,B+C,D+Z,0 2在这里,+代表1补数加法,即将前面的16位校验和按位取反。1可以以(A,B+C,D+J,0+(0,K+Y,Z) 3的形式进行计算。2.1.2 字节顺序的自主性打破被校验数据中的字节顺序仍可以计算出正确的16位校验和。例如,我们交换字节组中两字节的顺序,得到B,A+D,C+Z,Y 4所得到的得结构与1式是相同的(当然结果也是要进行一次反转的)。为什么会是这样呢?我们发现两种顺序获得的进位是相同的,都是从第15位到第0位进位以及从第7位到第8位进位。这也就是说,交换字节位置只是改变高低位字节的排列顺序,但并没有改变它们的内在联系。因此,无论底层的硬件设置中对字节的接收顺序如何,校验和都可以被准确地校验出来。例如,假设校验和是以主机序(高位字节在前低位字节在后)计算的数据帧,但以网络序(低位字节在前高位字节在后)存放在内存中。每一个16位的字中的字节在传送过程中都交换了顺序,在计算校验和之后仍会先交换位置再存入内存,这样就与接受到的原本以网络序存储的数据帧中的校验和项保持一致了。2.1.3 并进行计算某些机器的字处理长度是16位的倍数,这样可以提高它的计算速度。由于加法所具有的结合性,我们没有必要按照顺序对每个字节进行累加。相反,我们可以利用这一特点对它们进行并行累加。并行地计算校验和只是增加了每次累加的信息长度。例如,在一个323位的机器上,我们可以一次增加4个字节,即A,B,C,D+。计算结束后再把累加和“折叠”起来,把一个32位的数值变为16位,这样产生的新的进位也要循环累积起来。此外,在此仍不考虑字节顺序的问题,我们可以用D,C,B,A+或B,A,D,C+;这样的顺序来计算校验和,最终再通过交换16位校验和中的字节序来得到正确的值。这些改变顺序的方法都是为了让所有的偶数字节进入一个校验和字节,所有的奇数字节进入一个校验和字节。2.2 一些编码技术可以提高校验和的计算速度2.2.1延迟进位法这种方法在主要的累加循环结束之后再把进位累加进和值。其实现方式就是用32位的累加器获得16位校验和,这样溢出就产生在高16位上。这种方法避免了累加器中进位传感器机构的设置,但是它要求的容量是原来的累加器容量的两倍,因此它更多地依赖于硬件条件。2.2.2反向循环法这种方法可以减少由循环而产生的负荷,有效地展开内部的累加循环,把循环过程中的一系列加法命令复制下来。这种技术通常可以节省大量的时间,但是程序的逻辑设计会比较复杂。2.2.3合并数据拷贝法计算校验和以及读入数据都需要将数据从内存的一个位置转移到另一个位置,这样会占用内存总线的带宽,而内存总线的传输效率是提高校验和计算速度的瓶颈,尤其是对于某些机器(如一些简单的慢速的微型机)来说,这一问题尤为严重。为了解决这个问题,可以把数据读入的过程与校验的过程合二为一,也就是在读入数据的同时计算校验和,这样就可以省去一次数据移动的过程,从而提高校验和的计算速度。3、设计思路3.1 数据的输入方式输入数据可能是以字符形式存储的,而校验和的计算则要采用数据形式,所以在从文件读取数据时,都要进行字符到数据的相互转换。1)将读入的ASCII码转化为相应的整型变量。if(ch=0&=a&ch=A&ch0xff|lowbyte0xff)0 /高8位或低8位中的任何一方产生了溢出(进位)lowbyte+=(highbyte8); /低字节加上高字节超过8位的进位highbyte=highbutr&0xff; /清除高字节的进位highbyte+=(lowbyte8); /高字节加上来自低字节的进位lowbyte=lowbyte&0xff; /清除低字节的进位4、程序流程图程序开始,初始化ch,count,sum,checksum从文件读取一个字符chch=EOF?ch= ch转换为相应的8为数据,count+count偶数?ch低4位送入chr高4位ch低4位送入chr低4位得到chr值(count/2)%2=1?chr和sum高8位相加chr和sum低8位相加得到sum值将32位sum折叠到16位YYYNYN求sum反码并输出结束5、程序源代码#include#includevoid main(int argc,char *argv)FILE *fp;char ch;unsigned char chrl,chrh;unsigned int count=0,checksum=0,chr=0;unsigned long int sum=0;if(fp=fopen(E:1.txt,r)=NULL)/在E盘新建一个文本文档,命名为1.txt,判断文件是否存在printf(nn File cant be opened!);exit(1);printf(nnthe type of output:data-sumnn);while(1)if(ch=fgetc(fp)!=EOF)count+;if(ch!= )if(count%12=0)printf(n);if(ch=0&ch=a&ch=A&ch=F)ch=ch-A+10;if(count%2=1)/判断count的值是否为偶数chrh=ch4;elsechrl=ch&0x0f;chr=chrh|chrl;if(count%4=2)sum+=chr16)/将32位sum折叠到16位,求sum反码并输出checksum=(long(sum16)+long(sum&0x0000ffff);checksum=checksum&0x0000ffff;printf(nnsu
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号