コンピュータネットワークシミュレーション実験:C ++シミュレーション計算効果と

ファイルの16ビットチェックサムを計算するコンピュータープログラムを作成します。最速の方法は、32ビット整数を使用して合計を格納することです。キャリー(たとえば、16ビットを超えるもの)を処理し、チェックサムに追加することを忘れないでください。
原理:送信するデータを16ビットの2進整数のシーケンスと見なし、それらの合計を計算します。データバイトの長さが奇数の場合は、データの最後に0のバイトを追加して偶数を構成します。
例:16ビット検証と計算次の図は、16ビット検証と小さな文字列の計算を示しています。
検証合計を計算するために、送信側コンピューターは文字の各ペアを16ビット整数として扱い、検証合計を計算します。チェックサムが16ビットより大きい場合、キャリーは最終チェックサムに追加されます。
ここに画像の説明を挿入

私のコードのアイデア:ファイルのチェックサムを計算するには、最初にファイルの内容を読み取る必要があります。C++が提供するifstreamクラスを使用して、ファイルの内容を読み取り、テキストで読み取ります。ファイルの16ビットチェックサムを計算するため、2文字ごとに値が形成され、すべての値が合計されます。私のアプローチは、読み取られた文字を2文字ごとのグループに分割することです。文字は奇数であり、0のバイトを追加してから、各グループの最初の文字のASCII値に256と2番目の文字のASCII値を掛けて数値を作成します。次に、すべての値を加算して合計を取得し、合計を65536で除算して、キャリーを取得します。65536を法として合計を取得して、保持されている数値を取得します。最後に、キャリー番号と予約番号を加算してチェックサムの10進数を取得し、10進数を16進数に変換します。
コードの欠陥:
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