本站消息

站长简介/公众号

  出租广告位,需要合作请联系站长


+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

2024-11(2)

编写一个计算机程序用来计算一个文件的 16 位效验和(Java实现)

发布于2021-05-29 19:29     阅读(1054)     评论(0)     点赞(25)     收藏(3)


编写一个计算机程序用来计算一个文件的 16 位效验和(Java实现)

题目

编写一个计算机程序用来计算一个文件的 16 位效验和。最快速的方法是用一个 32 位的整数来存放这个和。记住要处理进位(例如,超过 16 位的那些位),把它们加到效验和中。

原理

把要发送的数据看成 16 比特的二进制整数序列,并计算他们的和。若数据字节长度为奇数,则在数据尾部补一个字节的 0 以凑成偶数。

示例

image-20210527232835835

程序设计思路

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:

image-20210527233003872

运行结果:

image-20210527233033418

原文链接:https://blog.csdn.net/weixin_45834777/article/details/117340581



所属网站分类: 技术文章 > 博客

作者:想要飞翔的天使

链接:http://www.javaheidong.com/blog/article/207106/78d67bee1e7d70b9b80b/

来源:java黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

25 0
收藏该文
已收藏

评论内容:(最多支持255个字符)