累加和校验算法(CheckSum算法)
摘自:https://blog.csdn.net/m0_37697335/article/details/83867199
因为外界总会对电路存在或多或少的干扰,对于数字信号,很可能导致传输的数据出现千差万别。对于很多需要传输数据的场合,尤其是一些数据可能会影响一些硬件的动作(诸如嵌入式的一些设备、机器人等),错误的数据可能会带来一些隐性风险,想想都可怕。
由于本人是嵌入式相关领域的,平时玩的都是单片机,当然单片机的性能千差万别,不过很多的性能都只能说是勉强够用,毕竟成本考虑。
所以今天的校验说法,比较简单,但是有效,尤其是一些性能一般的硬件。
说道今日主角:累加和校验算法,又名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语言的代码示例。
发送方:以下是如何得到校验值的代码,结果就是我们想要的校验值。
1 uint8_t TX_CheckSum(uint8_t *buf, uint8_t len) //buf为数组,len为数组长度 2 { 3 uint8_t i, ret = 0; 4 5 for(i=0; i<len; i++) 6 { 7 ret += *(buf++); 8 } 9 ret = ~ret; 10 return ret; 11 }
接收方:输入已包含发送发发来的校验值,如果函数返回的值如果是0,说明数据正确。
1 uint8_t RX_CheckSum(uint8_t *buf, uint8_t len) //buf为数组,len为数组长度 2 { 3 uint8_t i, ret = 0; 4 5 for(i=0; i<len; i++) 6 { 7 ret += *(buf++); 8 } 9 ret = ret; 10 return ret+1; 11 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
2018-09-03 【linux命令】setterm控制终端属性命令(中英文)
2018-09-03 IP命令的用法详解
2018-09-03 Linux shell之数组
2016-09-03 【C/C++】Linux下使用system()函数一定要谨慎
2016-09-03 【IPC通信】基于管道的popen和pclose函数
2016-09-03 【C/C++】Linux下system()函数引发的错误