ip首部校验和代码,看不懂??c语言版求高手!!
shortchecksum(ushortbufferintsize)//这两个变量是什么意思类型为什么要这样定义?????{unsignedlongcksum=0//类型...
short checksum(ushort buffer int size)//这两个变量是什么意思 类型为什么要这样定义?????
{
unsigned long cksum = 0 //类型为什么要定义成long????????
while(size> 1)//为什么size要大于1
{
cksum += buffer++ //???????????
size -= sizeof(ushort) //???????????
}
if(size)
{
cksum += (uchar)buffer
}
cksum = (cksum> > 16) + (cksum& 0xffff) //将高16bit与低16bit相加(&与运算把最高位去除 得到他的后16位)(整数移位后会只取整数部分)
cksum += (cksum> > 16) //将进位到高位的16bit与低16bit 再相加,为什么这里不进行与运算????
return (ushort)(~cksum) //~取反(转换成短整型)
} 展开
{
unsigned long cksum = 0 //类型为什么要定义成long????????
while(size> 1)//为什么size要大于1
{
cksum += buffer++ //???????????
size -= sizeof(ushort) //???????????
}
if(size)
{
cksum += (uchar)buffer
}
cksum = (cksum> > 16) + (cksum& 0xffff) //将高16bit与低16bit相加(&与运算把最高位去除 得到他的后16位)(整数移位后会只取整数部分)
cksum += (cksum> > 16) //将进位到高位的16bit与低16bit 再相加,为什么这里不进行与运算????
return (ushort)(~cksum) //~取反(转换成短整型)
} 展开
展开全部
short checksum(ushort buffer int size)//buffer表示需要进行校验和运算的内存开始地址 size表示这块内存区的长度
{
unsigned long cksum = 0 //由于是16位校验和最终要加上溢出位 所以要用long
while(size> 1)//因为ushort一次加上2个字节 如果结尾还剩一个字节的时候再按照这种方式加就会导致校验错误
{
cksum += buffer++ //校验和的原理就是 ,全部数据加起来, 再取反。 这样传输过程中如果出现数据错误 ,那么加起来的值就不一样。通过对比这个值来验证数据是否正确
size -= sizeof(ushort) //加一次后 size减ushort的长度(一般是2)
}
if(size)
{
cksum += (uchar)buffer//在只剩一个字节的 时候需要强制转换为uchar再进行加法运算
}
cksum = (cksum> > 16) + (cksum& 0xffff) //将溢出的部分相加
cksum += (cksum> > 16) //再次跟溢出的部分相加
return (ushort)(~cksum) //~取反(转换成短整型)
}
整个过程就是 将一个ushort内的数据全部加起来
然后将溢出部分加起来(由于校验值只是2个字节(ushort)所以要将溢出的部分也加进来)
溢出部分加的时候有可能再溢出一次(就是当校验值为0xffff时候 +上溢出的值就有可能再溢出一次
所以需要重新加一次
最后将得到的校验和取反转换为ushort型
{
unsigned long cksum = 0 //由于是16位校验和最终要加上溢出位 所以要用long
while(size> 1)//因为ushort一次加上2个字节 如果结尾还剩一个字节的时候再按照这种方式加就会导致校验错误
{
cksum += buffer++ //校验和的原理就是 ,全部数据加起来, 再取反。 这样传输过程中如果出现数据错误 ,那么加起来的值就不一样。通过对比这个值来验证数据是否正确
size -= sizeof(ushort) //加一次后 size减ushort的长度(一般是2)
}
if(size)
{
cksum += (uchar)buffer//在只剩一个字节的 时候需要强制转换为uchar再进行加法运算
}
cksum = (cksum> > 16) + (cksum& 0xffff) //将溢出的部分相加
cksum += (cksum> > 16) //再次跟溢出的部分相加
return (ushort)(~cksum) //~取反(转换成短整型)
}
整个过程就是 将一个ushort内的数据全部加起来
然后将溢出部分加起来(由于校验值只是2个字节(ushort)所以要将溢出的部分也加进来)
溢出部分加的时候有可能再溢出一次(就是当校验值为0xffff时候 +上溢出的值就有可能再溢出一次
所以需要重新加一次
最后将得到的校验和取反转换为ushort型
Storm代理
2023-07-25 广告
2023-07-25 广告
StormProxies是一家可靠的代理服务提供商,提供原生IP(住宅原生IP)和高匿名代理服务。以下是关于StormProxies的原生IP服务的一些信息:1. 住宅原生IP:StormProxies提供的住宅原生IP是指从真实的家庭或企...
点击进入详情页
本回答由Storm代理提供
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询