累加和校验算法(CheckSum算法)「建议收藏」

累加和校验算法(CheckSum算法)「建议收藏」因为外界总会对电路存在或多或少的干扰,对于数字信号,很可能导致传输的数据出现千差万别。对于很多需要传输数据的场合,尤其是一些数据可能会影响一些硬件的动作(诸如嵌入式的一些设备、机器人等),错误的数据可能会带来一些隐性风险,想想都可怕。由于本人是嵌入式相关领域的,平时玩的都是单片机,当然单片机的性能千差万别,不过很多的性能都只能说是勉强够用,毕竟成本考虑。所以今天的校验说法,比较简单,但是有…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全家桶1年46,售后保障稳定

因为外界总会对电路存在或多或少的干扰,对于数字信号,很可能导致传输的数据出现千差万别。对于很多需要传输数据的场合,尤其是一些数据可能会影响一些硬件的动作(诸如嵌入式的一些设备、机器人等),错误的数据可能会带来一些隐性风险,想想都可怕。

由于本人是嵌入式相关领域的,平时玩的都是单片机,当然单片机的性能千差万别,不过很多的性能都只能说是勉强够用,毕竟成本考虑。

所以今天的校验说法,比较简单,但是有效,尤其是一些性能一般的硬件。

说道今日主角:累加和校验算法,又名CheckSum算法。至于出处,这里就不考究了。

这种算法的实现:

发送方:对要数据累加,得到一个数据和,对和求反,即得到我们的校验值。然后把要发的数据和这个校验值一起发送给接收方。

接收方:对接收的数据(包括校验和)进行累加,然后加1,如果得到0,那么说明数据没有出现传输错误。(注意,此处发送方和接收方用于保存累加结果的类型一定要一致,否则加1就无法实现溢出从而无法得到0,校验就会无效)

还是举个例子:

发送方:要发送0xA8,0x50,我们使用unsigned char(8位)来保存累加和,即为0xF8(0b11111000),取反得到校验和为0x07(0b00000111)。然后将这三个数据发送出去。

接收方:如果接收正确,这三个数据的累加和就是(0b11111111),此时加1,则得到的结果为0(实际得到的应该是0b100000000,但是由于是使用unsigned char(8位)来保存累加和,所以高位被截取掉,只剩下了低八位的8个0).

由上面的例子,我们可以知道算法的目的是:使累加和和校验值相加得到一个二进制下每一位都是1的结果,这个结果很明显很好处理,这种算法实现起来也很简单,下面给出C语言的代码示例。

发送方:以下是如何得到校验值的代码,结果就是我们想要的校验值。

uint8_t TX_CheckSum(uint8_t *buf, uint8_t len) //buf为数组,len为数组长度
{ 
    uint8_t i, ret = 0;

    for(i=0; i<len; i++)
    {
        ret += *(buf++);
    }
     ret = ~ret;
    return ret;
}

Jetbrains全家桶1年46,售后保障稳定

接收方:输入已包含发送发发来的校验值,如果函数返回的值如果是0,说明数据正确。

uint8_t RX_CheckSum(uint8_t *buf, uint8_t len) //buf为数组,len为数组长度
{ 
    uint8_t i, ret = 0;

    for(i=0; i<len; i++)
    {
        ret += *(buf++);
    }
     ret = ret;
    return ret+1;
}

更多精彩内容,请关注公众号《嵌入式小散修》。
累加和校验算法(CheckSum算法)「建议收藏」

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/210067.html原文链接:https://javaforall.net

(0)
上一篇 2025年7月28日 下午4:43
下一篇 2025年7月28日 下午5:22


相关推荐

  • 与沃尔玛Walmart建立EDI连接的准备

    与沃尔玛Walmart建立EDI连接的准备与沃尔玛 Walmart 建立 EDI 连接 需要有 RetailLink 访问权限 RetailLink 是沃尔玛 Walmart 的供应商平台 供应商可以在这个平台上进行 EDI 项目的连接测试 业务测试以及正式切入生产 想要获取这个访问权限需要联系沃尔玛的 RetailLink 团队 对于 EDI 而言 Walmart 指的是 WalmartStore 包括山姆会员店 超级购物中心 沃尔玛超市 社区店以及分销中心 供应商在与沃尔玛 Walmart 建立 EDI 连接时需要清楚这一点 传输协议第一步需要准备好 EDI

    2026年3月19日
    3
  • angsrom linux opkg update 失败 解决方案[通俗易懂]

    angsrom linux opkg update 失败 解决方案[通俗易懂]在这篇文章的指导下解决了,Opkgupdate失败的问题,问题出在开发板的网络DNS配置,开发板可以访问局域网的,但是不能访问互联网,另外angstromlinux软件源feeds地址改变了不在是原来的所有需要更改/etc/opkg/*下的conf文件。这样就可以执行opkgupdate命令来安装软件了How-toupdateopkgpackagefeeds

    2022年5月12日
    105
  • wicket 乱码

    wicket 乱码使用 wicket 有时会莫名的乱码 最好方法是在以下所有地方都统一成 UTF 8 1 如果保用 mysql 数据库 要使数据库 表的字符集都为 utf8 2 如果用 spring 在 web xml 中加入 characterEnc springframew web filter CharacterEnc

    2026年3月18日
    2
  • WebClien使用国外代理服务器访问URL

    WebClien使用国外代理服务器访问URLusing(WebClientwc=newWebClient()){//代理服务器的IP和PortWebProxymyProxy=newWebProxy(CommonBLL.server,Convert.ToInt32(CommonBLL.port))…

    2022年4月29日
    66
  • XML格式化工具[通俗易懂]

    XML格式化工具[通俗易懂] 做接口开发的时候,往往接受参数或返回值是一个XML的字符串。如下图,不方便辨识两种方法,1.将它保存为xxx.xml,然后用浏览器打开。这种方法稍微有些麻烦。2.使用UltraEdit工具 …

    2022年7月16日
    14
  • Git-命令行-删除本地和远程分支

    Git-命令行-删除本地和远程分支

    2021年10月22日
    66

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号