分组校验和的java实现
来源:互联网 发布:捕鱼软件破解 编辑:程序博客网 时间:2024/06/11 05:57
分组校验和的算法用在了很多分组的计算中。现在只针对IP分组而言,IP分组只对IP分组头进行计算,算法如下:
1、计算校验和
1)初始时,将校验和域都设置为0
2)每16bit做二进制反码求和。
3)得到的结果取反便是检验和
2、验证校验和
1)将IP分组头中每16bit分为一小组,进行二进制反码求和
2)查看结果是否为0,如果为0,表示正确,否则表示错误。
何为二进制反码和?
下面是我个人理解:我们知道计算机中对数字有三种表示方法:原码、反码和补码,比如对8而言,1000为其原码,0111为其反码,1000为其补码。通常,计算机存储数字时都以补码形式存储。因此我们平时所做的加减法也可以说是二进制补码和。而反码求和,自然就是以反码表示的数字进行求和。比如8+9,补码(原码)求和:1000 + 1001 = 0001(17),反码求和0111 + 0110 = 1101。
经过总结规律,可以发现反码求和的结果满足如下规律:原码和+原码和高位移除之后再取反的结果。0001+0001(溢出) = 0010,取反为1101。
由于加法具有结合律,因此可以先对整个数组做原码加法,然后再取反
package com.IP;/** * Created by dave on 2016/2/19. *///计算头部校验和public class HeaderCheckSum { public String caculate(int[] data){//data以16bit形式传入,如0xabcd int sum = 0; for(int i = 0;i<data.length;i++){ sum += data[i]; } for(int i = 0;i<2;i++) {//这里循环两次,是因为sum溢出后的高位与低16bit相加之后仍然可能会溢出,所以需要再重复一次,那么会不会再次溢出呢?肯定不会,不妨试一试。 int low = sum & 0xffff; int high = (sum >> 16) & 0xffff; sum = low + high; } //16进制表示 String hexString = Integer.toHexString(~sum & 0xffff); System.out.println("校验和:"+hexString); return hexString; } //判断是否有效 public boolean isValid(int[] data){ int sum = 0; for(int tmp:data){ sum += tmp; } for(int i = 0;i<2;i++){ int low = sum & 0xffff; int high = (sum >> 16)&0xffff; sum = low + high; } boolean res = false; if((~sum & 0xffff) == 0) res = true; System.out.println("valid:"+res); return res; }}
0 0
- 分组校验和的java实现
- JAVA校验和算法的实现
- JAVA校验和算法的实现
- Java 实现CRC32校验和MD5
- JAVA参数验证 Validation(二)分组校验&自定义校验
- TCP校验和的原理和实现
- TCP校验和的原理和实现
- TCP校验和的原理和实现
- Java文件的MD5校验和CRC校验
- 使用Java实现Elasticsearch的分组功能
- java简要实现优先级的分组排序
- java关于打字校验正确率的实现
- Java实现银行卡号的校验
- Java实现银行卡号的校验j
- CRC16校验算法的Java实现
- (学习java)JQuery实现表单的校验
- springmvc中@valid的分组校验
- Memcache分组和同步机制的实现
- JS时间格式化-获取月份最大天数小技巧
- ViewGroup的onLayout、layout方法
- 2016-02-18补写
- 完美解决EditText和ScrollView的滚动冲突(上)
- Unity5 如何做资源管理和增量更新,unity5增量
- 分组校验和的java实现
- Github 搭建 hexo (四)——更换主题,disqus,RSS
- 喜欢我十九年的男孩结婚了
- javascrpt构建实用的类工厂
- 深入浅出Java回调机制 / 回掉函数 / 深入浅出理解 Java回调机制(异步) GOOD
- linux的echo命令详解
- FZU 2150 Fire Game
- 变量作用域与this指针
- POJ 2096 Collecting Bugs (概率DP)