输出:数据文件的效验和 效验和(checksum)原理:把要发送的数据看成二进制整数序列,并计算他们的和。若数据字节长度为奇数,则在数据尾部补一个字节的0以凑成偶数 例子:32位效验和计算,为了计算效验和,发送计算机把每对字符当成32位整数处理并计算效验和。如果效验和大于32位,那么把进位一起加到最后的效验和中。 package shuju; import java.util.*; import java.io.*; public class shujuu { public static void main(String args[]) throws IOException { File file = new File("D:\\报文1.bin"); FileInputStream fis = new FileInputStream(file); int a[] = new int[1024]; int rel[] = new int[1024]; int temp = 0; int count = 0; while ((temp=fis.read())!=-1) { a[count++] = (int)temp; /*数字读入*/ } if(count%2 !=0) { count++; rel = Arrays.copyOf(a, count); /*序号为奇数的放在rel数组中*/ rel[rel.length-1] =0; /*确保奇偶对称*/ } else { rel = Arrays.copyOf(a, count); /*序号为偶数放在rel数组中*/ } int b[] = new int[count/2]; for(int i=0,j=0;i<b.length;i++) { for(;j<rel.length;) { b[i] = (int) (rel[j]*256+rel[j+1]);/*2的8次方*/ break; } /*叠加运算,8位一组,结果保存在b数组中*/ j=j+2; } fis.close(); int total=0; int carry=0; for(int i=0;i<b.length;i++) { total+=b[i]; /*总数*/ } while(true) { if(total>65536) { carry++; total=total-65536; /*65535是计算机16位二进制最大数*/ } else { break; } } System.out.println(Integer.toHexString(total)); } }