컴퓨터 네트워크 시뮬레이션 실험 : C ++ 시뮬레이션 계산 효과 및

파일의 16 비트 체크섬을 계산하는 컴퓨터 프로그램을 작성하십시오. 가장 빠른 방법은 32 비트 정수를 사용하여 합계를 저장하는 것입니다. 캐리 (예 : 16 비트 이상)를 처리하고 체크섬에 추가하는 것을 잊지 마십시오.
원리 : 16 비트 이진 정수의 시퀀스로 전송할 데이터를 고려하고 그 합계를 계산합니다. 데이터 바이트의 길이가 홀수이면 데이터 끝에 0 바이트를 추가하여 짝수를 구성합니다.
예 : 16 비트 검증 및 계산 아래 그림은 16 비트 검증 및 작은 문자열의 계산을 보여줍니다.
확인 합계를 계산하기 위해 보내는 컴퓨터는 각 문자 쌍을 16 비트 정수로 처리하고 확인 합계를 계산합니다. 체크섬이 16 비트보다 크면 캐리가 최종 체크섬에 추가됩니다.
여기에 사진 설명 삽입

내 코드 아이디어 : 파일의 체크섬을 계산하려면 먼저 파일의 내용을 읽어야합니다. C ++에서 제공하는 ifstream 클래스를 사용하여 파일 내용을 읽고 텍스트로 읽습니다. 파일의 16 비트 체크섬을 계산하기 때문에 두 문자마다 값이 형성되고 모든 값이 합산됩니다. 제 접근 방식은 읽은 문자를 두 문자마다 그룹으로 나누는 것입니다. characters는 홀수이고, 바이트 0을 더한 다음 각 그룹의 첫 번째 문자의 ASCII 값에 256을 더한 두 번째 문자의 ASCII 값을 곱하여 숫자 값을 형성합니다. 그런 다음 모든 값을 더하여 합계를 구하고 합계를 65536으로 나누고 캐리를 얻습니다. 합계 모듈로 65536을 취하여 보유 된 숫자를 얻습니다. 마지막으로 캐리 번호와 예약 번호를 추가하여 체크섬의 십진수를 구한 다음 십진수를 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