题目
编写一个计算机程序用来计算一个文件的16位效验和。最快速的方法是用一个32位的整数来存放这个和。记住要处理进位(例如,超过16位的那些位),把它们加到效验和中。
要求:
1. 以命令行形式运行:check_sum infile。其中check_sum为程序名,infile为输入数据文件名。
2. 输出:数据文件的效验和
附:效验和(checksum)
- 原理:把要发送的数据看成16比特的二进制整数序列,并计算他们的和。若数据字节长度为奇数,则在数据尾部补一个字节的0以凑成偶数。
- 例子:16位效验和计算,下图表明一个小的字符串的16位效验和的计算。为了计算效验和,发送计算机把每对字符当成16位整数处理并计算效验和。如果效验和大于16位,那么把进位一起加到最后的效验和中。
本地数据样式
分析
这道题的校验和没有要求最后取反,实际上求和后是要取反的;
原理不难理解,就是数据转换成十六进制,然后十六进制求和。四位十六进制,所以也要求进位加到结果中;
难点在于字符转十六进制,十六进制有进位相加(我这里是用string存储十六进制数,可能网上还有更直接的十六进制的存储方式和计算方式);
先用char类型数组把数据逐个存进数组中;
将每两个char字符转为四位十六进制,其中会先将每个char字符先转为二位十六进制;
最后进行十六进制的求和,我没有选择将进位留到最后再相加,而是每一次运算都完成进位的相加,因为经过多次运算后,