打印
[MM32软件]

和(checksum)校验算法

[复制链接]
248|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
tpgf|  楼主 | 2023-12-21 08:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
和校验应用场合还是比较多的,比如常见的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

使用特权

评论回复
沙发
jcky001| | 2023-12-27 11:08 | 只看该作者
C语言的基础知识真多啊

使用特权

评论回复
板凳
公羊子丹| | 2023-12-27 20:49 | 只看该作者
不错的内容学习了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1536

主题

14520

帖子

9

粉丝