当前位置:  技术问答>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位   

|
只是一个用于计算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;这要看协议而定。

|
计算校验和用的吧,常用于判断数据通信中是否发生了误码

    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 请问图象内容以byte[]形式保存,请看例子,偶不明白其中含义!!
  • i=$(($i+1))。为什么i=$($i+1)就不行呢?不明白里面那层括号起什么作用。 iis7站长之家
  • 请教大家!!!java如何实现多重继承?接口该如何使用?份数可以再加,只要我明白了
  • 一个问题,有点不明白!!!
  • linux crontab 设定老是想不明白。。。。
  • 有句话不明白,求解释
  • 关于终端的一些小问题,不明白。。。
  • Makefile中的一句不明白,关于shell中sed函数
  • 我在看一个GNU软件时发现有这么一句,不明白什么意思
  • 不明白seteuid()的作用
  • i=$(($i+1))。为什么i=$($i+1)就不行呢?不明白里面那层括号起什么作用。
  • 在init脚本中屡屡看到类似命令,不明白的说:mount -t sysfs /sys /sys
  • VMWare上装了个Fedora,但装不上VMWareTools,新手,不明白为什么
  • 总算明白gettext函数是怎么用的了!散分
  • 想了解LINUX一定能明白汇编语言吗?
  • 请问:什么是组合?看了THINGKING IN JAVA后,还是不是很明白
  • 我不是很明白,请帮忙!
  • method overriding 的意思我明白,但在中文里应该翻译成什么为好?
  • 关于字体的问题?实在是看不明白sun的api文档!!!!!!!!!!!!
  • 灌水贴子,有什么不明白到www.52jsp.com论坛看看
  • 小弟一直弄不明白this这个关键字。


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3