• 大小: 87KB
    文件类型: .rar
    金币: 1
    下载: 0 次
    发布日期: 2021-05-04
  • 语言: 其他
  • 标签:

资源简介

校验和算法描述:为保证网络上传输的数据的可靠性,在许多协议中都设置了校验和项,例如:IPv4、ICMPv4、IGMPV4、ICMPv6、UDP和TCP 等等。计算这些校验和的算法称为网际校验和算法,简单来说就是:把被校验的数据16位进行累加,然后取反码,若数据字节长度为奇数,则数据尾部补一个字节的0以凑成偶数。 由于从输入文件读入的数据不能直接满足计算校验和的条件,所以首先对从文件读入缓冲区的数据进行预处理,即读入缓冲区时忽略空格。由于累加是按16位进行的,所以每次从缓冲区中读出4个字符,并将字符转换成对应的16进制数字,如此依次累加,直至数据全部读完。 还有一种情况,即如果数据长度为奇数个字节,则需要判断,并补0累加。程序中利用的是缓冲区长度计数器i和当前读取到计数器j判断数据长度是否为奇数。即如果数据长度为偶数,则读完数据时当前读取到计数器j的值应与缓冲区长度i相等,而如果数据长度为奇数,则读完数据时,当前读取到计数器j>缓冲区长度i,此时需将缓冲区中剩余的两个字符读出,并补0,转换成相应16进制数以后参与累加。 当累加结束后,将累加和的16位以上数据位移下再进行一次累加,并对最后累加和取反即得所求校验和。

资源截图

代码片段和文件信息

#include 
#include 
#include 
#include 

#define MAX_BUFF 256

void main(int argcchar* argv[])
{
FILE* stream;
char buff[MAX_BUFF]; //缓冲区数组 最大256个字符
long sum=0; //累加器
char nstring[5]; //待转换成数字进行累加的字符串 (4个)
int number=0; //待加数
unsigned short checksum; //校验和
int count;

// for(int count=0;count// buff[count]=‘\0‘;
if(argc!=2) 
{
printf(“args error!“);
return;
} //如果参数个数不对,则打印错误,返回

if((stream=fopen(argv[1]“r“))!=NULL) //打开对应文件,准备操作
{
while(!feof(stream)) //如果文件结束则累加操作结束
{
for(count=0;!feof(stream)&&(count { //缓冲区容量,且忽略空格,count最后存放读出
char a=fgetc(stream); //数据的个数
while(a==‘ ‘) a=fgetc(stream);
buff[count]=a;
}
if(feof(stream)) count--; //如果文件已经结束,则计数器count减一
for(int j=0;j { //每次读4个
for(int k=0;k<4;k++)
nstring[k]=buff[j+k];
nstring[4]=‘\0‘;
sscanf(nstring“%x“&number);
sum+=number; //将转换好的数据累加
}
if(j>count) //如果数据为奇数个,则补一个00
{
nstring[0]=buff[count-2];
nstring[1]=buff[count-1];
nstring[2]=‘0‘;
nstring[3]=‘0‘;
nstring[4]=‘\0‘;
sscanf(nstring“%x“&number);
sum+=number;
}
}
while(sum>>16) //高位累加
sum = (sum & 0xffff) + (sum >> 16);
checksum=~(unsigned short)sum; //累加和取反得校验和
printf(“%x\n“checksum);
}
fclose(stream);
}

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----

     文件       1749  2004-10-22 12:39  校验和算法\check_sum.cpp

     文件      20992  2004-10-22 12:48  校验和算法\check_sum.doc

     文件       3437  2004-10-31 17:07  校验和算法\check_sum.dsp

     文件        541  2004-10-31 17:07  校验和算法\check_sum.dsw

     文件     172078  2004-10-21 22:46  校验和算法\check_sum.exe

     文件      41984  2004-11-08 11:50  校验和算法\check_sum.ncb

     文件      53760  2004-11-08 11:50  校验和算法\check_sum.opt

     文件       1141  2004-10-31 17:07  校验和算法\check_sum.plg

     文件       2163  2004-10-22 12:14  校验和算法\framer.cpp

     文件      31232  2004-10-22 13:19  校验和算法\framer.doc

     文件       3401  2004-10-31 17:07  校验和算法\framer.dsp

     文件        535  2004-10-31 17:07  校验和算法\framer.dsw

     文件     163886  2004-10-22 12:12  校验和算法\framer.exe

     文件      52224  2005-01-12 15:39  校验和算法\framer.ncb

     文件      53760  2004-11-08 11:50  校验和算法\framer.opt

     文件       1117  2004-10-31 17:07  校验和算法\framer.plg

     文件         59  2004-10-12 15:32  校验和算法\infile1.txt

     文件        404  2004-10-19 06:43  校验和算法\infile2.txt

     文件         20  2003-11-02 21:17  校验和算法\input1

     文件        556  2003-11-02 21:17  校验和算法\input2

     文件         69  2004-10-31 17:06  校验和算法\output1

     文件        579  2004-10-31 17:06  校验和算法\output2

     目录          0  2005-10-11 19:51  校验和算法

----------- ---------  ---------- -----  ----

               605687                    23


评论

共有 条评论

相关资源