您的位置:首页 > 理论基础 > 计算机网络

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

2017-12-01 18:54 211 查看
#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进制表示的数值

然后累加

返回累加值
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  jw c++语言