在远距离通信中,保证数据完整性和准确性,在数据最后附上总和检验码是很有必要的,带上一个1字节的数据,效率高也起到了一定的安全性。
Checksum:总和检验码,校验总和。在数据处理和数据通信领域中,用于校验目的的一组数据项的和。这些数据项可以是数字或在计算检验总和过程中看作数字的其它字符串。
它通常是以十六进制为数制表示的形式,如 0102030405060708
原理:
通常我们采用1字节的方式进行校验和计算,
Xsum = X1 ‖ X2 ‖… ‖ XN. Xi (i = 1, 2, … N) 为1字节数据。下标i 为由左至右的字节序号。
校验和的计算
CheckSum = (~(X1 ‖ X2 ‖… ‖ XN) + 1) mod 100h
校验和的检验
如果 ((X1 ‖ X2 ‖… ‖ XN) + Check-Sum) mod 100h 为0.说明校验成功,否则失败。
本源码的ln限制在:(2的32次方-1)除以255
实现源码:
unsigned char CheckSum(unsigned char* p, unsigned long ln)
{
unsigned long sum = 0;
for(unsigned long i(0);i<ln;i++)
{
sum += p[i];
}
sum = ~sum;
return ((sum + 1)%0x100);
}
bool CheckCheckSum(unsigned char* p, unsigned long ln, unsigned char c)
{
unsigned long sum = 0;
for(unsigned long i(0);i<ln;i++)
{
sum += p[i];
}
sum += c;
if(sum%0x100 == 0)
return 1;
else
return 0;
}