和校验应用场合还是比较多的,比如常见的HEX文件,S-Record文件都用到了和校验,当然,和校验并没有标准,不同的和校验计算方法也不尽相同,但本质都是累加求和(有些地方也叫异或)只是在结果的处理上稍有不同。
下面介绍几种常用的和校验算法。
1.累计和取反
uint8_t CalcChecksum(uint8_t *pBuf, uint32_t nLength)
{
uint8_t checksum = 0;
while (nLength--)
{
checksum += *pBuf++;
}
checksum = (uint8_t)(0xff - checksum);
//checksum = ~checksum;
return checksum;
}
这种校验算法,针对结果进行了按位取反,有些地方描述是用0xff-累加和,其效果是一样的,S-Record文件的校验和算法就是这样设计的。校验数据是否正确时,可将数据与校验码和一起计算在加1,如果和(uint8_t类型)为0,则校验正确,否则错误。
2.累加和求补码
uint8_t CalcChecksum(uint8_t *pBuf, uint32_t nLength)
{
uint8_t checksum = 0;
while (nLength--)
{
checksum += *pBuf++;
}
checksum = (~checksum) + 1;
return checksum;
}
这种校验算法,针对结果取其补码,HEX文件的校验和算法就是这样设计的,这样设计的好处是数据与校验和一起计算校验和,如果校验和正确会得到0值,否则错误。
3.直接返回累加和
uint8_t CalcChecksum(uint8_t *pBuf, uint32_t nLength)
{
uint8_t checksum = 0;
while (nLength--)
{
checksum += *pBuf++;
}
return checksum;
}
这种校验算法,针对结果不做任何处理,程序判断时需要直接比较2者值是否一致。
————————————————
版权声明:本文为CSDN博主「propor」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/propor/article/details/134920066
|