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

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

一、前言

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

二、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.lryc.cn/news/43309.html

相关文章:

  • Anaconda 的安装配置及依赖项的内外网配置
  • p84 CTF夺旗-PHP弱类型异或取反序列化RCE
  • 2022财报逆转,有赞穿透迷雾实现突破
  • 蓝桥杯 - 求组合数【C(a,b)】+ 卡特兰数
  • 膳食真菌在癌症免疫治疗中的作用: 从肠道微生物群的角度
  • 怎么将模糊的照片变清晰
  • 【软件测试】基础知识第一篇
  • 【百面成神】java web基础7问,你能坚持到第几问
  • Centos7安装、各种环境配置和常见bug解决方案,保姆级教程(更新中)
  • 【C++进阶】智能指针
  • 软件测试面试题 —— 整理与解析(3)
  • springboot常用的20个注解
  • USB组合设备——带鼠标功能的键盘
  • 数据结构与算法基础-学习-18-哈夫曼编码
  • ZMC408CE | 实现“8通道独立PSO”应用场景
  • QuickJS中JS_SetClassProto方法把JavaScript对象指定为某个类的原型对象
  • 泰克信号发生器特点
  • 贯穿设计模式第四话--里氏替换原则
  • 6501: 鸡兔同笼
  • Linux项目自动化构建工具-make/makefile 介绍及使用
  • 【云原生|Docker】06-dokcerfile详解
  • 【SCL】博图——先入先出排序法
  • OSPF----特殊区域
  • JVM-类加载
  • 超详细讲解C语言文件操作!!
  • linxu学习之进程
  • 蓝桥杯真题2
  • PWM互补输出,以及死区时间计算
  • 基于深度学习的海洋动物检测系统(Python+YOLOv5+清新界面)
  • C# 计算方差