计算机网络模拟实验:C++模拟计算效验和

编写一个计算机程序用来计算一个文件的16位效验和。最快速的方法是用一个32位的整数来存放这个和。记住要处理进位(例如,超过16位的那些位),把它们加到效验和中。
原理:把要发送的数据看成16比特的二进制整数序列,并计算他们的和。若数据字节长度为奇数,则在数据尾部补一个字节的0以凑成偶数。
例子:16位效验和计算,下图表明一个小的字符串的16位效验和的计算。
为了计算效验和,发送计算机把每对字符当成16位整数处理并计算效验和。如果效验和大于16位,那么把进位一起加到最后的效验和中。
在这里插入图片描述

本人代码思路:计算文件的校验和首先要读取文件中的内容,我使用C++提供的ifstream类来读取文件内容,以文本方式读取。因为是计算文件的16位校验和,因此每两个字符组成一个数值,然后将所有的数值进行相加,我的做法是把读取到的字符以每两个字符划分为一个组,要是字符个数为奇数,要做补一个字节的0,然后将每一个小组的第一个字符的ascii值乘以256加上第二个字符的ascii值组成一个数值。再把所有的数值相加得到总和,将总和除以65536,得到进位数;将总和取模65536,得到保留数。最后将进位数和保留数相加得到校验和的十进制数,再将该十进制数转化为十六进制数就行了。
代码缺陷:
1.不能计算过大的文件
2.不能计算含中文的文件

#include<iostream>
#include<fstream>
#include<string>
using namespace std;
int main()
{
    
    
	string text="";    //用来保存还没进行累加的字符串
	ifstream in;
	int sum=0;      //保存总校验和
	int len;
	in.open("text.txt", ios::in);        //打开测试文件
	if (!in)       //若打开文件失败,则退出程序
	{
    
    
		cout << "打开文件失败" << endl;
		exit(1);
	}
	string temp_text;  //用于保存从文件中读取出来的一行数据
	while (getline(in, temp_text))
	{
    
    
		text = text + temp_text;
		len = text.length();       //获取一行数据的字符个数
		if (len % 2 == 0)         //一行数据的字符串个数为偶数
		{
    
    
			for (int i = 0; i < len; i = i + 2)    //累加一行字符串的ascii值
			{
    
    
				sum += int(text[i]) * 256 + int(text[i + 1]);    //将字符强制转化成相对应的ascii值
			}
			text = "";             
		}
		else
		{
    
    
			for (int i = 0; i < len - 1; i = i + 2)
			{
    
    
				sum += int(text[i]) * 256 + int(text[i + 1]);
			}

			text = text[len-1];       //因为字符串的个数为奇数,所以还存在一个字符未进行处理
		}
	}
	in.close();
	if (text != "")
	{
    
    
		cout << "数据字节总长度为奇数,需要在数据尾部补一个字节的0以凑成偶数" << endl;
		sum += int(text[0]) * 256 + 0;
	}
	else
		cout << "数据字节总长度为偶数,不需要进行补字节" << endl;
	int carry = sum / 256 / 256;             //记录进位数
	cout << "进位数为"<<carry << endl;
	if (carry > 0)    //如果存在进位,就把进位一起加到最后的效验和
		sum = sum % 65536 + carry;
	char sum_str[15];
	cout << "校验和的十进制为:" << sum<< endl;
	_itoa_s(sum, sum_str,10, 16);       //将sum转化为十六进制的字符串,并保存在sum_str中
	cout << "校验和的十六进制为:" << sum_str << endl;
}

测试内容和测试结果:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_44933518/article/details/106750819