发布于2021-05-29 19:29 阅读(1079) 评论(0) 点赞(25) 收藏(3)
编写一个计算机程序用来计算一个文件的 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 {
//读入文件,模拟从网络传输数据过来
bf = new BufferedReader(new FileReader("D:\\IDEAProjects\\jvm\\jvmTEST\\data.txt"));
//读入一行数据,计算校验和
String s = bf.readLine();
while(s != null){
System.out.println("传输的数据:" + s);
List<String> list = new ArrayList<>();
//转化为字符串数组,方便计算
char[] chars = s.toCharArray();
int sum = 0;
for(int i = 0; i < chars.length; i++){
if(i + 1 < chars.length){
//每两个字符拼接成一个16位的字符串
String h1 = Integer.toHexString(chars[i++] & 0xFFFF);
String h2 = Integer.toHexString(chars[i] & 0xFFFF);
StringBuilder sb = new StringBuilder();
//这里使用StringBuilder拼接
String ss = sb.append(h1).append(h2).toString();
//将拼接完的字符串添加到list
list.add(ss);
}else {
//如果最后只剩一个字符(8位),也直接加入list,后面参与校验和运算
String h = Integer.toHexString(chars[i] & 0xFFFF);
list.add(h);
}
}
System.out.print("数据的十六进制表示:\t");
for (String l : list){
System.out.print(l + "\t");
//将list里面每个字符串表示的16位数转化出来
int i = Integer.parseInt(l, 16);
//累加求和,先不考虑校验和多余16位的问题
sum += i;
}
System.out.println();
//将总和转化位字符串,如果长度大于4位就说明超过16位,再进行处理
String s1 = Integer.toHexString(sum);
while (s1.length() > 4){
//这里采用将后4位和其余部分的字符串都转化为十进制然后相加,再转化为十六进制,检查新字符串长度是否还大于4
//大于4重复上面的过程
String s2 = s1.substring(0, s1.length() - 4);
String s3 = s1.substring(s1.length() - 4, s1.length());
sum = Integer.parseInt(s2, 16) + Integer.parseInt(s3, 16);
s1 = Integer.toHexString(sum);
}
String res = Integer.toHexString(sum);
System.out.println("校验和为:" + res);
s = bf.readLine();
System.out.println("***********一次数据的校验和计算完成***********");
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (bf != null){
bf.close();
}
}catch (Exception e){
e.printStackTrace();
}
}
}
}
data.txt:
运行结果:
原文链接:https://blog.csdn.net/weixin_45834777/article/details/117340581
作者:想要飞翔的天使
链接:http://www.javaheidong.com/blog/article/207106/78d67bee1e7d70b9b80b/
来源:java黑洞网
任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任
昵称:
评论内容:(最多支持255个字符)
---无人问津也好,技不如人也罢,你都要试着安静下来,去做自己该做的事,而不是让内心的烦躁、焦虑,坏掉你本来就不多的热情和定力
Copyright © 2018-2021 java黑洞网 All Rights Reserved 版权所有,并保留所有权利。京ICP备18063182号-2
投诉与举报,广告合作请联系vgs_info@163.com或QQ3083709327
免责声明:网站文章均由用户上传,仅供读者学习交流使用,禁止用做商业用途。若文章涉及色情,反动,侵权等违法信息,请向我们举报,一经核实我们会立即删除!