当前位置: 首页 > article >正文

单片机常用完整性校验算法

一、前言

单片机在开发过程中经常会遇到大文件传输,或者大量数据传输,在一些工业环境下,数据传输并不是很稳定,如何检验数据的完整性就是个问题,这里简单介绍一下单片机常用的几种数据完整性校验方法。

二、CheckSum校验和

简单来说将需要传输的所有数据按照指定的位数先取反码,然后相加,将相加的校验和和要发送的数据包放在一起进行传输;接收方接收到数据后,将数据段和跟随一起传输的校验和都取反相加,如果结果为0,则校验和成功,这一帧数据完成性校验成功。

优点:计算简单,CPU资源占用小,单片机可以很流利的运行。

缺点:完整性检验能力较弱,比如自身数据取反相加,发生相对的错误时,一个多1,一个少1,校验和则无法检验出。

推荐参考文章:https://blog.csdn.net/tangchenchan/article/details/51212440

三、CRC循环冗余校验

CRC 校验的原理也很简单,先指定一个多项式,对应 2 进制码,在要计算的二进制数据屁股上补上比多项式最高项少一位的0,然后将补完的数据与多项式进行模2取余,取余的结果和补0的数据相加,最终得到经过CRC校验处理的数据,打包发送到另一端,另一端将得到的数直接与多项式做模2运算,结果等于0则 CRC 校验完成,否则失败。单片机中常用的CRC有CRC16和CRC32,主要就算多项式不同,最后末尾补的CRC校验码长度也不一致。

优点:计算速度快,检错能力强,检测错误率可到 bit 级别。

缺点:当多项式越复杂,计算量也越大,不过也可以通过提前计算好表的方式,以空间换时间提高效率。

推荐1CRC学习文章:https://blog.csdn.net/xwdrhgr/article/details/123257922

我们在单片机中使用 crc 校验也不需要自己来写,推荐一份开源的 crc 源码,mit 协议,随便耍,github链接:lammertb/libcrc: Multi platform CRC library (github.com)

四、Hash校验

一句话描述 Hash 算法就是将任意长度的数据通过算法计算成固定长度的值,接收方得到数据后再用相同的算法去计算出固定长度的值,比对发送方的hash值就可以判断数据的完整性,目前常用的hash算法有:MD5、SHA-1、SHA-224、SHA-256、SHA-384、SHA-512、SHA-512/224、SHA-512/256,其中MD5、SHA-1可以通过计算出的固定值反推出原镜像,所以不能用来做安全性校验,而其他的算法暂时还未破解,既可以做镜像完整性校验,一定程度上可以做安全性校验。

Hash的各个算法原理就不多讲了哈,博主也不是很清除,对于想要在单片机上使用Hash算法的同学,可以参考这个仓库:smartmx/hash-match: using hashmap on MCUs (github.com)

想要直接在win下加密镜像,可以参考下这个开源项目:gurnec/HashCheck: HashCheck Shell Extension for Windows with added SHA2, SHA3, and multithreading; originally from code.kliu.org (github.com)

Hash算法可以完成完整性校验以及简单的安全加密,但缺点就算计算量大,并且只能后检验,不能在数据传输时事实检验,同学们在使用时根据实际场景酌情使用~

今天就学到这了!


http://www.kler.cn/a/3879.html

相关文章:

  • Ubuntu 24.04 LTS 安装 tailscale 并访问 SMB共享文件夹
  • LabVIEW电源纹波补偿
  • 5 分钟复刻你的声音,一键实现 GPT-Sovits 模型部署
  • 正态分布检验(JB检验和威尔克检验)和斯皮尔曼相关系数(继上回)
  • Qt Desiogn生成的ui文件转化为h文件
  • C语言编程笔记:文件处理的艺术
  • 【云原生|Docker】06-dokcerfile详解
  • 仓库管理系统有哪些作用?选择仓库管理系统要注意这4大问题!
  • 初识操作系统
  • Linux进程概念—环境变量
  • 【Spring事物三千问】TransactionSynchronizationManager的原理分析
  • 力扣-行程和用户
  • python redis连接池sub/pub断开连接问题
  • SparkSql编程开发
  • Proteus8.15安装包下载及安装教程
  • 【Python】在python中使用MySQL
  • Postgresql实战:使用pg_basebackup或pg_start_backup方式搭建Postgresql主从流复制
  • 代码随想录【Day42】动态规划 | 背包问题、416. 分割等和子集
  • 人工智能交互系统界面设计(Tkinter界面设计)
  • docker本地私有仓库搭建
  • 数据分析学习项目:东京奥运会跳水评论分析
  • python玄阶斗技--tkinter库
  • ChatGPT原理解析
  • 广州蓝景分享—如何结合人工智能学习前端开发
  • 代码随想录算法训练营第四十一天| 343 整数拆分 96 不同的二叉搜索树
  • 铁威马NAS教程之利用docker快速搭建个人在线书库