通过编写校验和计算程序,对指定的文件计算校验和,以加深对计算校验和算法的掌握。

输出:数据文件的效验和
效验和(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));
        }
    }




你可能感兴趣的:(java,String,二进制,数据,32位)