二进制反码求和运算方法.docx

上传人:知****量 文档编号:69952493 上传时间:2023-01-12 格式:DOCX 页数:6 大小:21.24KB
返回 下载 相关 举报
二进制反码求和运算方法.docx_第1页
第1页 / 共6页
二进制反码求和运算方法.docx_第2页
第2页 / 共6页
点击查看更多>>
资源描述

《二进制反码求和运算方法.docx》由会员分享,可在线阅读,更多相关《二进制反码求和运算方法.docx(6页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、二进制反码求和运算方法二进制反码求和运算方法 编辑整理:尊敬的读者朋友们:这里是精品文档编辑中心,本文档内容是由我和我的同事精心编辑整理后发布的,发布之前我们对文中内容进行仔细校对,但是难免会有疏漏的地方,但是任然希望(二进制反码求和运算方法)的内容能够给您的工作和学习带来便利。同时也真诚的希望收到您的建议和反馈,这将是我们进步的源泉,前进的动力。本文可编辑可修改,如果觉得对您有帮助请收藏以便随时查阅,最后祝您生活愉快 业绩进步,以下为二进制反码求和运算方法的全部内容。二进制反码求和0和0相加是0,0和1相加是1,1和1相加是0但要产生一个进位1,加到下一列若最高位相加后产生进位,则最后得到的

2、结果要加上溢出的进位1(可能是多個1)。IP/ICMP/IGMP/TCP/UDP等协议的校验和算法都是相同的,算法如下:在发送数据时,为了计算IP数据包的校验和.应该按如下步骤:(1)把IP数据包的校验和字段置为0;(2)把首部看成以16位为单位的数字组成,依次进行二进制反码求和;(3)把得到的结果存入校验和字段中。在接收数据时,计算数据包的校验和相对简单,按如下步骤:(1)把首部看成以16位为单位的数字组成,依次进行二进制反码求和,包括校验和字段;(2)检查计算出的校验和的结果是否等于零(反码应为16个0);(3)如果等于零,说明被整除,校验是和正确。否则,校验和就是错误的,协议栈要抛弃这个

3、数据包。所谓的二进制反码求和,即为先进行二进制求和,然后对和取反。计算对IP首部检验和的算法如下:(1)把IP数据包的校验和字段置为0;(2)把首部看成以16位为单位的数字组成,依次进行二进制求和(注意:求和时应将最高位的进位保存,所以加法应采用32位加法);(3)将上述加法过程中产生的进位(最高位的进位)加到低16位(采用32位加法时,即为将高16位与低16位相加,之后还要把该次加法最高位产生的进位加到低16位)(4)将上述的和取反,即得到校验和.其中,二进制反码求和的计算方法:1 0 0 1 1 0 0 1 0 0 0 1 0 0 1 00 0 0 0 1 0 0 0 0 1 1 0 1

4、0 0 11 0 1 0 1 0 1 1 0 0 0 0 0 0 1 00 0 0 0 1 1 1 0 0 0 0 0 1 0 1 00 0 0 0 0 0 0 0 0 0 0 1 0 0 0 10 0 0 0 0 0 0 0 0 0 0 0 1 1 1 10 0 0 0 0 1 0 0 0 0 1 1 1 1 1 10 0 0 0 0 0 0 0 0 0 0 0 1 1 0 10 0 0 0 0 0 0 0 0 0 0 0 1 1 1 10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 00 1 0 1 0 1 0 0 0 1 0 0 0 1 0 10 1 0 1 0 0 1 1

5、0 1 0 1 0 1 0 00 1 0 0 1 0 0 1 0 1 0 0 1 1 1 10 1 0 0 0 1 1 1 0 0 0 0 0 0 0 0_1 0 0 1 0 1 1 0 1 1 1 0 1 0 1 0 部分和1 -第15列的进位1 -第16列的进位_1 0 0 1 0 1 1 0 1 1 1 0 1 1 0 0 和0 1 1 0 1 0 0 1 0 0 0 1 0 0 1 1 校验和图B1 二进制记法的部分和1,当我们加第1列(最右边一列)的时候,我们得到8。在二进制中,数8是1000。我们保留最右边的0,把其余的位进到第2列,第3列和第4列.2,当我们加第2列时,我们计入从

6、第1列来的进位。结果是7,它是二进制的0111.我们保留第一个位(最右边的),把其余011进位给第3列、第4列和第5列。3,对每一列重复以上过程.4,当我们加完最后一列时,我们有两个1没有列可以进行进位。这两个1在下一个步骤中应与部分和(Partial sum)相加.B。1.2和如果最后一列没有进位,那么部分和就是和。但是,如果还有额外的列(在本例中,有一个具有两行的列),那么就要把它加到部分和中,以便得出和。下图给出了这样的计算,现在我们得出了和。1 0 0 1 0 1 1 0 1 1 1 0 1 0 1 0 部分和1 0 第15,16列的进位_1 0 0 1 0 1 1 0 1 1 1 0

7、 1 1 0 0 和0 1 1 0 1 0 0 1 0 0 0 1 0 0 1 1 校验和图B2 二进制记法的和与校验和B.1。2校验和在计算出和以后,我们把每一个位求反码,得出检验和。图B2也给出了检验和。二进制计算方法其实可以转换为十进制计算,原理相同。算法的实现:首先,查看了Linux 2.6内核中的校验算法,使用汇编语言编写的,显然效率要高些.代码如下:unsigned short ip_fast_csum(unsigned char * iph,unsigned int ihl)unsigned int sum;_asm_ _volatile_(”movl (%1), %0 ;n”s

8、ubl 4, 2 ;n”jbe 2f ;n”addl 4(%1), %0 ;n”adcl 8(1), 0 ;n”adcl 12(1), 0 ;n1: adcl 16(%1), 0 ;n”lea 4(%1), %1 ;n”decl 2 ;njne 1b ;n”adcl $0, 0 ;n”movl %0, %2 ;n”shrl $16, 0 ;n”addw w2, %w0 ;nadcl $0, %0 ;n”notl 0 ;n”2: ;n/ Since the input registers which are loaded with iph and ihlare modified, we must

9、 also specify them as outputs, or gccwill assume they contain their original values. */: =r” (sum), ”=r” (iph), =r” (ihl): ”1” (iph), 2 (ihl): ”memory”);return(sum);在这个函数中,第一个参数显然就是IP数据报的首地址,所有算法几乎一样.需要注意的是第二个参数,它是直接使用IP数据报头信息中的首部长度字段,不需要进行转换,因此,速度又快了(高手就是考虑的周到).使用方法会在下面的例子代码中给出。第二种算法就非常普通了,是用C语言编写的。我看了许多实现网络协议栈的代码,这个算法是最常用的了,即使变化,也无非是先取反后取和之类的。考虑其原因,估计还是C语言的移植性更好吧.下面是该函数的实现:unsigned short checksum(unsigned short buf,int nword)unsigned long sum;for(sum=0;nword0;nword-)sum += *buf+;sum = (sum16) + (sum0xffff);sum += (sum16);return sum;

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 初中资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁