编写一个计算机程序用来计算一个文件的16位效验和。最快速的方法是用一个32位的整数来存放这个和。记住要处理进位(例如,超过16位的那些位),把它们加到效验和中。
原理:把要发送的数据看成16比特的二进制整数序列,并计算他们的和。若数据字节长度为奇数,则在数据尾部补一个字节的0以凑成偶数。
例子:16位效验和计算,下图表明一个小的字符串的16位效验和的计算。
为了计算效验和,发送计算机把每对字符当成16位整数处理并计算效验和。如果效验和大于16位,那么把进位一起加到最后的效验和中。
本人代码思路:计算文件的校验和首先要读取文件中的内容,我使用C++提供的ifstream类来读取文件内容,以文本方式读取。因为是计算文件的16位校验和,因此每两个字符组成一个数值,然后将所有的数值进行相加,我的做法是把读取到的字符以每两个字符划分为一个组,要是字符个数为奇数,要做补一个字节的0,然后将每一个小组的第一个字符的ascii值乘以256加上第二个字符的ascii值组成一个数值。再把所有的数值相加得到总和,将总和除以65536,得到进位数;将总和取模65536,得到保留数。最后将进位数和保留数相加得到校验和的十进制数,再将该十进制数转化为十六进制数就行了。
代码缺陷:
1.不能计算过大的文件
2.不能计算含中文的文件
#include<iostream>
#include<fstream>
#include<string>
using namespace std;
int main()
{
string text=""; //用来保存还没进行累加的字符串
ifstream in;
int sum=0; //保存总校验和
int len;
in.open("text.