计算机网络中,16位校验和的实现

#include <iostream>
#include <fstream>
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
using namespace std;
struct M
{
	int hegiht;
	int low;
};
struct MM
{
	M m1;
	M m2;
};
MM add(MM g1, MM g2)
{
	MM demo;
	int f[4] = { 0 };
	int ff[4] = { 0 };
	int c1, c2, c3, c4;
	c1 = g1.m2.low + g2.m2.low;
	if (c1 >= 16) f[3] = 1;
	c2 = g1.m2.hegiht + g2.m2.hegiht;
	if (c2 >= 16) f[2] = 1;
	c3 = g1.m1.low + g2.m1.low;
	if (c3 >= 16) f[1] = 1;
	c4 = g1.m1.hegiht + g2.m1.hegiht;
	if (c4 >= 16)f[0] = 1;

/*	if ((c1 + f[0]) / 16) ff[3] = 1;
	demo.m2.low = (c1 + f[0]) % 16;
	
	if ((c2 + f[3] + ff[3]) / 16) ff[2] = 1;
	demo.m2.hegiht = (c2 + f[3]+ff[3]) % 16;
	
	if ((c3 + f[2] + ff[2]) / 16) ff[1] = 1;
	demo.m1.low = (c3 + f[2]+ff[2]) % 16;
	
	demo.m1.hegiht = (c4 + f[1]+ff[1]) % 16;*/
	demo.m2.low = (c1 + f[0]) % 16;
	demo.m2.hegiht = (c2 + f[3]) % 16;
	demo.m1.low = (c3 + f[2]) % 16;
	demo.m1.hegiht = (c4 + f[1]) % 16;
	return demo;
}
void show(MM key)
{
	char a, b, c, d;
	if (key.m1.hegiht>9)a = key.m1.hegiht - 10 + 'A';
	else a = key.m1.hegiht + '0';
	if (key.m1.low>9)b = key.m1.low - 10 + 'A';
	else b = key.m1.low + '0';
	if (key.m2.hegiht>9)c = key.m2.hegiht - 10 + 'A';
	else c = key.m2.hegiht + '0';
	if (key.m2.low>9)d = key.m2.low - 10 + 'A';
	else d = key.m2.low + '0';
	cout<<a<<b<<c<<d<<endl;
}
int main()
{
	FILE *fp;
	char ch;//保存每个字节
	int chh, chl;//保存字符的高位和低位
	MM u1, key;
	key.m1.hegiht = 0;
	key.m1.low = 0;
	key.m2.hegiht = 0;
	key.m2.low = 0;
	int fl;
	unsigned int count = 0, checknum = 0, k = 0;
	unsigned long int sum = 0;
	if ((fp = fopen("1.txt", "r")) == NULL)
		cout << "file open error!";
	while (true)
	{
		if ((ch = fgetc(fp)) != EOF)
		{
			chh = (int)ch / 16;
			chl = (int)ch % 16;
			count = count % 2;
			switch (count)
			{
			case 0:
			{
				u1.m1.hegiht = chh;
				u1.m1.low = chl;
				break;
			}
			case 1:
			{
				u1.m2.hegiht = chh;
				u1.m2.low = chl;
				key = add(key, u1);
			}
			}
			count++;
			//cout<<key.m1.hegiht<<key.m1.low<<key.m2.hegiht<<key.m2.low<<endl;
		}
		else
		{
			break;//当读取到最后,则退出循环
		}
	}
	if (count == 0)
	{
		u1.m2.hegiht = 0;
		u1.m2.low = 0;
		key = add(key, u1);
	}
	show(key);
	fclose(fp);
}

算法思路:

打开要校验的文本文件,

每个字符得读取,直到读取到文件最后

通过该字符的acaii变化成16进制表示

然后保存并和下一个字符组成一个双16进制表示的数值

然后累加

返回累加值

猜你喜欢

转载自blog.csdn.net/play_841266670/article/details/78690051