爱学it学无止境
检验和(checksum),在数据处理和数据通信领域中,用于校验目的地一组数据项的和。它通常是以十六进制为数制表示的形式。如果校验和的数值超过十六进制的FF,也就是255. 就要求其补码作为校验和。通常用来在通信中,尤其是远距离通信中保证数据的完整性和准确性。(此引用了检验和的百度百科)
用处:
在计算机网络中的网络层、运输层的IP协议、TCP协议、UDP协议等高层协议,在报文中存在一个校验和的字段,这个字段的作用是:验证报文在传输过程中是否被改动,如果接收方检测到检验和有差错,则TCP段会被直接丢弃。如下图在IP报文中占4字节。
原理:
把要发送的数据看成 16 比特的二进制整数序列,并计算他们的和。若数据字节长度为奇数,则在数据尾部补一个字节的 0 以凑成偶数。
例子:
16 位效验和计算,下图表明一个小的字符串的 16 位效验和的计算。为了计算效验和,发送计算机把每对字符当成 16 位整数处理并计算效验和。如果效验和大于 16 位,那么把进位一起加到最后的效验和中。
主要思想为:
1.打开文件,用一个字符串存下里面内容
2.首先判断字符串长度是否为奇数,若为奇数,后面补一个“0”
3.将字符串里面的字符进行读取,并转化成ASCII码对应。每次读取两个字符,也就是每两个为一组。
4.由于字符要化为十六进制后拼接,那么两位里面的前一位将乘于16的平方(256)
5.每一组的十进制数相加
6.先将相加得到的化为2进制存放在int里面,再进行处理,int型里面有32位,我们分为前16位和后16位,对于溢出的在进行处理
而这是现在网上大多数的做法,我现在只是为了更直观,在4、5、6步进行修改
4.由于字符要化为十六进制后拼接,那么两位里面的前一位将乘于16的平方(256),转化成16进制
5.每一组的16进制数相加
6.相加时,超过了0xFFFF(16位最大值),则进行溢出处理。
c++代码