资源简介
校验和算法描述:为保证网络上传输的数据的可靠性,在许多协议中都设置了校验和项,例如: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 校验和算法\fr
文件 31232 2004-10-22 13:19 校验和算法\fr
文件 3401 2004-10-31 17:07 校验和算法\fr
文件 535 2004-10-31 17:07 校验和算法\fr
文件 163886 2004-10-22 12:12 校验和算法\fr
文件 52224 2005-01-12 15:39 校验和算法\fr
文件 53760 2004-11-08 11:50 校验和算法\fr
文件 1117 2004-10-31 17:07 校验和算法\fr
文件 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
- 上一篇:黑苹果电量补丁
- 下一篇:Dedegetshell
评论
共有 条评论