概述
说明
- checksum:总和检验码,校验和,可以理解为check(校验),sum(和)。
- 在数据处理和通信领域,通过一定算法对传输的数据进行求和以校验数据的完整性和准确性。
使用
算法
- 求和的算法大致是确定的,但是一些细节不是很重要,例如:校验和使用几个字节存储,只要收发两边处理规则一样就行。
- 网上示例,如下:
USHORT CICMP::CheckSum(USHORT *buff,int Size)
{
unsigned long cksum = 0;
//将数据以字为单位累加到cksum中
while (Size > 1)
{
cksum += *buff;
Size -= sizeof(USHORT);
}
//如果为奇数,将最后一个字节扩展到双字,在累加到cksum中
if (Size)
{
cksum += *(UCHAR*)buff;
}
//将cksum的高16位和低16位相加,取反后得到效验和
cksum = (cksum >> 16) + (cksum & 0xffff);
cksum += (cksum >> 16);
return (USHORT)(~cksum);//位运算符号:位取反!比如有int a=3;则先把十进制数3,转化为二进制数,即00000011.那么~a=11111100
}
流程
- 在数据发送端对数据进行checksum。
- 将计算出的checksum取反,存放在数据末尾或其它位置发送给接收端。
- 接收端收到数据后对所有数据进行checksum,如果checksum为0表示数据正确。
原理
- checksum为0表示数据正确原因:除了数据中的checksum值,其它数据的sum值等于checksum取反,两值相加值的所有位为1,再取反后即为0,也就是所有数据的checksum为0。
- 如果所有数据的checksum不为0说明数据发生过变化,因此数据是无效的。
个人理解
- checksum算法是不可靠的,只能在要求不是很严格的情况下使用,无法用来判断数据是否一致。
- checksum算法中每个数据都是位置无关的,因此该算法无法检测出数据发生交换,测试可知:数据发生交换c不会影响hecksum。
- checksum能在一些情况下使用,因为数据在发送过程中交换的可能性较小,发生0/1翻转的数据不抵消就能检测到,但是应用层一些业务逻辑出现0/1翻转抵消的情况好像挺常见,因此个人对checksum的可靠性表示怀疑。
最后
以上就是故意枕头为你收集整理的checksum 算法说明使用的全部内容,希望文章能够帮你解决checksum 算法说明使用所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复