欢迎来到天天文库
浏览记录
ID:56101630
大小:138.50 KB
页数:8页
时间:2020-03-16
《计算机校验和程序.doc》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、广西师范大学计算机科学与信息工程学院实验3计算机校验和程序1.实验目的(1)在给定数据报格式条件下构造数据报并计算数据报校验和;(2)掌握网络层校验和计算的原理与软件实现方法;(3)掌握计算网络校验和的增量式算法。实验环境(设备)平台:WindowsXP;环境:VisualC++6.0实验内容【实验方案设计】一自定义格式如下:报文类型(8位)长度(8位)校验和(16位)数据字段。。。程序要求以命令行形式运行:Checksuminputfileoutputfile其中Checksum是程序名,inputfile是输入
2、文件名,该文件包含数据字段的内容,outputfile是输出文件名,该文件保存封装完毕后的数据报。【实验过程】(实验步骤、记录、数据、分析)二网际校验和算法:1把检验和字段置0,把所有需要校验的数据划分为16位一组的比特序列,然后对每16位的反码求和,结果取反,便得到校验和2广西师范大学计算机科学与信息工程学院为了验证校验和的正确性,对所有数据求反码和,如果结果全1,则表示校验结果正确三计算校验和1算法思想是:将进位累加的过程延迟到整个累加循环结束之后进行,从而提高计算速度2实现:在32位的计算机上,把需要校验的数
3、据按16位一组进行累加,结果存放在32位的累加器中,这样溢出位就保存在高16位上。全部累加结束后再把32位累加器中高16位累加到低16位上,那么低16位值的反码即为最终校验和3延迟进位法通过函数checksum_calculating来实现。函数checksum_calculating的输入参数为pBuffer和nSize,pBuffer指向需要校验的数据缓冲区,nSize为需要的校验数据的大小,一字节为单位,返回值为16位的校验和。四具体实现程序代码如下:#include#include<
4、fstream.h>#include//用于使用网络顺序显示:htons#pragmacomment(lib,"WS2_32.LIB")/***************************************************************************计算给定数据的校验和*输入参数:*pBuffer指向需要校验的数据缓冲区广西师范大学计算机科学与信息工程学院*nSize需要校验的数据的大小,以字节为单位*返回值:*16位的校验结果**************
5、************************************************************/unsignedshortchecksum_calculating(unsignedshort*pBuffer,intnSize){unsignedlongdwCksum=0;//32位累加和//以两字节为单位反复累加while(nSize>1){dwCksum+=*pBuffer++;nSize-=sizeof(unsignedshort);}//如果总字节数为奇数则加上最后一个字节if(nS
6、ize){dwCksum+=*(unsignedchar*)pBuffer;}//将32位累加和的高16位与低16位第一次相加dwCksum=(dwCksum>>16)+(dwCksum&0xffff);//将上一步可能产生的高16位进位再次与低16位累加广西师范大学计算机科学与信息工程学院dwCksum+=(dwCksum>>16);//返回16位校验和return(unsignedshort)(~dwCksum);}voidmain(intargc,char*argv[]){//判断输入的命令行格式是否正确if
7、(argc!=3){cout<<"请按以下格式输入命令行:Checksuminputfileoutputfile"<8、ios::binary);//把文件指针移到文件末尾fInfile.seekg(0,ios::end);//取得输入文件的长度unsignedshortwLen=(unsignedsh9、ort)fInfile.tellg();广西师范大学计算机科学与信息工程学院//文件指针位置初始化fInfile.seekg(0,ios::beg);//定义数据报缓冲区,缓冲区大小为4+wLen,其中4为数据报类型字段、长度字段//以及校验和字段的长度和,wLen为数据字段长度,即输入文件长度(以字节为单位)unsignedchar*pBuf=newuns
8、ios::binary);//把文件指针移到文件末尾fInfile.seekg(0,ios::end);//取得输入文件的长度unsignedshortwLen=(unsignedsh
9、ort)fInfile.tellg();广西师范大学计算机科学与信息工程学院//文件指针位置初始化fInfile.seekg(0,ios::beg);//定义数据报缓冲区,缓冲区大小为4+wLen,其中4为数据报类型字段、长度字段//以及校验和字段的长度和,wLen为数据字段长度,即输入文件长度(以字节为单位)unsignedchar*pBuf=newuns
此文档下载收益归作者所有