📄 check_sum.cpp
字号:
/*! \file check_sum.cpp
\brief 定义控制台应用程序的入口点。
*/
#include "stdafx.h"
using namespace std;
/*! \fn 主函数
\brief 输入为check_sum infile1.txt/infile2.txt
*/
int _tmain(int argc, _TCHAR* argv[])
{
if(argc!=2) //输入参数出错,返回失败
{
cout<<"USAGE:inouttest file"<<endl;
return 1;
}
ifstream in(argv[1]);
if(!in) //无法打开输入文件,返回失败
{
cout<<"cannot open file";
return 1;
}
int sumall=0; // 数据总和
char temp;
int n=0;
int sum=0; // 每次读取的四个char类型数据,折合为二进制数的和
while(!in.eof()) //按16位读取数据,
{
in.get(temp);
if(n<4) //每次读取四个char型数据(恰好为4个4位二进制数)
{
n++;
if(temp>='A'&&temp<='F') //由于输入文件为.txt格式,需要把数据由char转换为16进制数
{
temp=temp-55;
sum=16*sum+temp;
}
else
if(temp>='0'&&temp<='9')
{
temp=temp-48;
sum=16*sum+temp;
}
else
n--;
}
if(n==4) //读完4个char,将其加入总和中
//文件为偶数个字节时,亦直接调用此部分
{
n=0;
sumall=sumall+sum;
sum=0;
}
}
if(n<4&&n>0) //文件为奇数个字节,则将其作为高八位,也加入总和中
{
sum=sum*16*16;
sumall=sumall+sum;
}
cout<<endl;
cout<<"数据总和:"<<sumall<<endl; //输出总和
while(sumall>>16) //将总和折叠为16位数据(参见RFC1071中算法)
sumall=(sumall>>16)+(sumall&0xffff);
cout<<"校验和:"<<hex<<(unsigned short)~sumall<<endl;//输出校验和:折叠后总和的反码
return 0;
}
/*!\mainpage 校验和计算程序说明文档
* \section problem 一 题目要求
*\subsection a (一) 目的:
为保证网络上传输的数据的可靠性,在许多协议中都设置了校验和项,例如:IPv4、ICMPv4、IGMPV4、ICMPv6、UDP和TCP 等等。
计算这些校验和的算法称为网际校验和算法,简单来说就是:把被校验的数据16位进行累加,然后取反码,若数据字节长度为
奇数,则数据尾部补一个字节的0以凑成偶数。要求同学们根据上述算法,编制程序对于给定数据计算它的校验和,关于算法更
详细的信息请参考RFC1071。
\subsection b (二) 要求:
1、 命令行:check_sum infile
其中check_sum是程序名,infile是数据文件名
2、 输出:数据文件的校验和。
3、 要有良好的编程规范和注释。
4、 写文档
\section enviorment 二 程序编写与运行环境
操作系统 windows 2000 professional sp4
使用语言 c++
编译环境 Microsoft Visual Stdio.Net 2003
\section use 三 程序运行方法
在命令行方式下,键入:check_sum infile
infile参数:可在infile1、infile2中任选。
输出为输入文件中16位数据的总和以及校验和。
具体算法说明详见主函数内注释
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -