编写一个计算机程序用来计算一个文件的 16 位效验和(Java实现)
题目
编写一个计算机程序用来计算一个文件的 16 位效验和。最快速的方法是用一个 32 位的整数来存放这个和。记住要处理进位(例如,超过 16 位的那些位),把它们加到效验和中。
原理
把要发送的数据看成 16 比特的二进制整数序列,并计算他们的和。若数据字节长度为奇数,则在数据尾部补一个字节的 0 以凑成偶数。
示例
程序设计思路
1.使用BufferedReader读入文件,每次读一行,每次都会得到一个String类型变量;
2.将该String类型变量转化为char型数组,便于后面拼接计算;
3.数组中,每两个char使用StringBuilder来拼接成一个字符串(因为是每32位进行校验和计算),若数组长度为奇数则单独成一个数;这里是先让char数组元素转化为十进制再转化为十六进制字符串,保证了数据的准确;例:Integer.toHexString(chars[i++] & 0xFFFF)
4.每次一个字符串拼接成了16进制表示32位的字符串后,要加入list,方便后面计算;
5.计算环节:
a.累加求和,先不考虑校验和多余16位的问题;
b.将总和转化位字符串,如果长度大于4位就说明超过16位,再进行处理;
c.将后4位和其余部分的字符串都转化为十进制然后相加,再转化为十六进制,检查新字符串长度是否还大于4;d.如果还大于4,重复上述过程,直到字符串长度最终位4.
总体思路是转化位十进制计算后再转化为十六进制,整个过程主要是进制转化,利用好丰富的API能把一些问题简单化。
源代码及运行结果
代码:
package com.deserts.network;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.util.ArrayList;
import java.util.List;
/**
* @ClassName checkSumTest
* @Description TODO
* @Author deserts
* @Date 2021/5/26 23:00
*/
public class checkSumTest {
public static void main(String[] args) {
BufferedReader bf = null;
try