当前位置: 技术问答>linux和unix
不太明白下面的代码的含义及用途??请大虾指教!!!感谢
来源: 互联网 发布时间:2016-05-16
本文导语: unsigned short in_cksum(unsigned short *addr, int len) { int nleft = len; int sum = 0; unsigned short *w = addr; unsigned short answer = 0; /* * Our algorithm is simple, using a 32 bit accumulator (sum), we add * sequential 16 bit words to it, a...
unsigned short
in_cksum(unsigned short *addr, int len)
{
int nleft = len;
int sum = 0;
unsigned short *w = addr;
unsigned short answer = 0;
/*
* Our algorithm is simple, using a 32 bit accumulator (sum), we add
* sequential 16 bit words to it, and at the end, fold back all the
* carry bits from the top 16 bits into the lower 16 bits.
*/
while (nleft > 1) {
sum += *w++;
nleft -= 2;
}
/* 4mop up an odd byte, if necessary */
if (nleft == 1) {
*(unsigned char *)(&answer) = *(unsigned char *)w ;
sum += answer;
}
/* 4add back carry outs from top 16 bits to low 16 bits */
sum = (sum >> 16) + (sum & 0xffff); /* add hi 16 to low 16 */
sum += (sum >> 16); /* add carry */
answer = ~sum; /* truncate to 16 bits */
return(answer);
}
|
checksum(校验和)常用于通讯。
发送方把所有数据用某种算法做累加,最后的结果取最后一或两个字节,一起发送过去
接受方把接收到的数据用同样的算法累加,如果结果和接受的的校验和一致,就说明发送正确。
至于具体的算法,可以自己随意约定,只要双方一样就可以了。
比如1楼的那几行,就是把4字节的int结果变成2字节的
(sum >> 16) 就是高16位
(sum & 0xffff); 就是低16位
发送方把所有数据用某种算法做累加,最后的结果取最后一或两个字节,一起发送过去
接受方把接收到的数据用同样的算法累加,如果结果和接受的的校验和一致,就说明发送正确。
至于具体的算法,可以自己随意约定,只要双方一样就可以了。
比如1楼的那几行,就是把4字节的int结果变成2字节的
(sum >> 16) 就是高16位
(sum & 0xffff); 就是低16位
|
只是一个用于计算checksum的算法
Checksum
检测数据传输错误的一种方法。
它将一连串的数据看作8比特或16比特的二进制整数序列并附加上计算出的这些整数的和。
在发生数据传输错误时,此值将与接收方所计算出的结果不一致,从而可以得知有错误发生。
这种方法原理简单便于理解,但与其他错误检测方法相比,可靠性较差。
是一种用于检查数据传输完整性的方法。
校验和是通过对一系列的字节施加一系列算术运算而计算出的一个整数值。
接收端对收到的数据再重新进行计算并与发送方的计算结果进行比较,以验证数据传输的正确性。
SQL语言的checksum函数
select checksum (*) from course
checksum函数表示对一组数据的和进行校验,可探测表的变化,返回在表的行上或在表达式列表上计算的校验值。CHECKSUM 用于生成哈希索引。
Checksum
检测数据传输错误的一种方法。
它将一连串的数据看作8比特或16比特的二进制整数序列并附加上计算出的这些整数的和。
在发生数据传输错误时,此值将与接收方所计算出的结果不一致,从而可以得知有错误发生。
这种方法原理简单便于理解,但与其他错误检测方法相比,可靠性较差。
是一种用于检查数据传输完整性的方法。
校验和是通过对一系列的字节施加一系列算术运算而计算出的一个整数值。
接收端对收到的数据再重新进行计算并与发送方的计算结果进行比较,以验证数据传输的正确性。
SQL语言的checksum函数
select checksum (*) from course
checksum函数表示对一组数据的和进行校验,可探测表的变化,返回在表的行上或在表达式列表上计算的校验值。CHECKSUM 用于生成哈希索引。
|
赞同以上的说法。
补充一点:
这里的Checksum计算方式,只取一个字(2个字节)的宽度,
sum = (sum >> 16) + (sum & 0xffff); /* add hi 16 to low 16 */
如果结果超出16位,则把超出16位部分也用同样方法加进来:
sum += (sum >> 16); /* add carry */
最后取反:
answer = ~sum; /* truncate to 16 bits */
有些应用,取反后还加1;这要看协议而定。
补充一点:
这里的Checksum计算方式,只取一个字(2个字节)的宽度,
sum = (sum >> 16) + (sum & 0xffff); /* add hi 16 to low 16 */
如果结果超出16位,则把超出16位部分也用同样方法加进来:
sum += (sum >> 16); /* add carry */
最后取反:
answer = ~sum; /* truncate to 16 bits */
有些应用,取反后还加1;这要看协议而定。
|
计算校验和用的吧,常用于判断数据通信中是否发生了误码