0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

单片机中常用的轻量级校验算法

strongerHuang 来源:strongerHuang 2023-03-24 10:22 次阅读

UART有一个奇偶校验,CAN通信有CRC校验。Modbus、MAVlink、USB等通信协议也有校验信息

在自定义数据存储时,有经验的工程师都会添加一定校验信息。

你平时通信,或者数据存储时,你有用到校验信息吗?下面就介绍几种常见的校验算法

校验和

校验和是最基本,也是嵌入式软件工程师最常用的一种校验算法,其实现方法很简单,简单到只有几行代码。

实现的方式方法很多,不同的编程语言,不同的应用有所不同,下面以C语言8位校验和为例:

uint8_t CheckSum(uint8_t *Buf, uint8_t Len)
{
  uint8_t i = 0;
  uint8_t sum = 0;
  uint8_t checksum = 0;


  for(i=0; i

异或校验

【异或校验】与【校验和】类似,对数据进行“异或”,最终得到一个“异或值”。

uint8_t CheckXOR(uint8_t *Buf, uint8_t Len)
{
  uint8_t i = 0;
  uint8_t x = 0;


  for(i=0; i
 校验和、异或校验的方式有很多种,比如有的还会传入一个参数作为异或校验的值。


当然,以上代码仅供学习参考,实际应用需结合项目情况修改代码。

CRC校验

CRC:Cyclic Redundancy Check,即循环冗余校验。

CRC是数据通信领域中最常用的一种查错校验码,其特征是信息字段和校验字段的长度可以任意选定。循环冗余检查(CRC)是一种数据传输检错功能,对数据进行多项式计算,并将得到的结果附在帧的后面,接收设备也执行类似的算法,以保证数据传输的正确性和完整性。

CRC校验属于冗余校验中的一种,大学学计算机相关专业的同学都应该学过CRC校验(学习时可能没几个同学搞明白了)

CRC有多种变体,比如:CRC-1、 CRC-5-USB、 CRC-8、 CRC-16、 CRC-32、 CRC-64等。其中,在嵌入式领域,CRC-16用的比较多。

常见CRC参数模型:

bf686df8-c97c-11ed-bfe3-dac502259ad0.png

比如一种在单片机上实现CRC16的源码:

uint8_t CRCTAB_H[256] = {/*表省略*/};
uint8_t CRCTAB_L[256] = {/*表省略*/};
void CRC16(uint8_t *pData, uint8_t Len, uint8_t *CRC_H, uint8_t *CRC_L)
{
  uint8_t  i;
  uint8_t  index;
  uint8_t  crc_h = 0xFF;
  uint8_t  crc_l = 0xFF;


  for(i=0; i
 CRC校验不同场景实现方式不同,网上也有很多公开的库和源码,比如:

LibCRC – C语言中的开源CRC库:

https://github.com/lammertb/libcrc

网上还有在线计算CRC校验值以及代码生成工具,感兴趣的读者可以自行了解。

MD5算法

MD5:Message-Digest Algorithm 5,即“信息-摘要算法。

从名字来看就知道它是从MD3、MD4发展而来的一种加密算法,其主要通过采集文件的信息摘要,以此进行计算并加密。

通过MD5算法进行加密,文件就可以获得一个唯一的MD5值,这个值是独一无二的,就像我们的指纹一样,因此我们就可以通过文件的MD5值来确定文件是否正确,密码进行加密后也会生成MD5值,论坛就是通过MD5值来验证用户的密码是否正确的。

bf9501ba-c97c-11ed-bfe3-dac502259ad0.png


MD5是输入不定长度信息,输出固定长度128-bits的算法。经过程序流程,生成四个32位数据,最后联合起来成为一个128-bits散列。基本方式为,求余、取余、调整长度、与链接变量进行循环运算。得出结果。

MD5的源码在网上都能找到现成的,而且有不同编程语言(C、 C++JAVA)版本。

比如由网友talent518分享的C语言版本:

https://github.com/talent518/md5

其他更多

随着变成技术越来越发达,校验算法也越来越多,有通用的算法,也有特殊领域特定的算法。

比如我之前做过密码相关的开发,使用了由密码管理局发布的SM3密码杂凑算法

还有从MD4算法改进而来的SHA-1算法(Secure Hash Algorithm 1即安全散列算法1)。

本文就分享到这里,市面上的校验算法还有很多,如有需要可自行上网了解。

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • CAN
    CAN
    +关注

    关注

    52

    文章

    2199

    浏览量

    457266
  • 算法
    +关注

    关注

    23

    文章

    4230

    浏览量

    90063
  • crc
    crc
    +关注

    关注

    0

    文章

    178

    浏览量

    28977
  • C语言
    +关注

    关注

    179

    文章

    7214

    浏览量

    117680
  • uart
    +关注

    关注

    21

    文章

    1084

    浏览量

    99079
收藏 人收藏

    评论

    相关推荐

    基于C8051F的CRC校验算法的实现

    校验算法的实现 
    发表于 03-14 17:14

    轻量级的ui框架如何去制作

    轻量级单片机UI框架框架元素用户接口代码开源平时常看csdn,但是从来没有自己写过。正好这几天需要用单片机做一个简易的ui界面,于是自己写了一个轻量级的ui框架。发个csdn分享给大家
    发表于 07-14 07:39

    如何自制轻量级单片机UI框架?

    轻量级单片机UI框架?
    发表于 10-14 06:13

    算法移植到STM32单片机中常见的问题有哪些?

    算法移植到STM32单片机中常见的问题有哪些?
    发表于 11-22 07:10

    LTE系统的CRC校验算法及DSP实现

    常用CRC校验算法的研究分析,为TD-LTE测试仪表系统选择了一种最优的CRC校验算法,并在TMS320C64xDSP中实现。将CRC校验程序在CCS3.3中运行,其结果验证了算法的可行性、高效性。
    发表于 02-23 14:58 30次下载

    单片机常用算法设计

    单片机常用算法归纳
    发表于 04-05 14:01 4次下载

    如何使用SMART编写CRC的校验算法程序

    校验算法程序。
    发表于 10-24 08:00 3次下载
    如何使用SMART编写CRC的<b>校验算法</b>程序

    如何使用51单片机实现CRC校验算法

    校验)原理及集成混合信号片上系统单片机C8051F的新特性,推导获得以字节为单位的数据序列CRC码递推算法,利用C8051F单片机的自带CAN2.0B总线接口控制器可以很方便
    发表于 12-17 16:09 16次下载
    如何使用51<b>单片机</b>实现CRC<b>校验算法</b>

    基于Feistel结构的超轻量级分组密码算法

    轻量级分组密码
    发表于 05-31 15:37 4次下载

    原创分享:自制轻量级单片机UI框架

    轻量级单片机UI框架框架元素用户接口代码开源平时常看csdn,但是从来没有自己写过。正好这几天需要用单片机做一个简易的ui界面,于是自己写了一个轻量级的ui框架。发个csdn分享给大家
    发表于 11-05 15:20 29次下载
    原创分享:自制<b>轻量级</b><b>单片机</b>UI框架

    CRC校验算法原理及c语言实现

    校验算法原理及c语言实现
    发表于 11-30 10:04 8次下载

    单片机中常用的C语言语句合集

    单片机中常用的C语言语句合集
    发表于 01-12 09:24 42次下载

    IP协议校验算法程序

    校验算法,其计算比较简单:设校验和初值为0,然后对数据每16位求异或,结果取反,便得校验和。校验时将数据(含校验和)按同样的算法求和,结
    发表于 08-13 10:55 810次阅读

    针对单片机开发的轻量级OTA组件

    单片机开发的轻量级 OTA 组件:mOTA。
    的头像 发表于 12-26 09:36 710次阅读

    单片机中几种常见的校验算法介绍

    常用的一种查错校验码,其特征是信息字段和校验字段的长度可以任意选定。循环冗余检查(CRC)是一种数据传输检错功能,对数据进行多项式计算,并将得到的结果附在帧的后面,接收设备也执行类似的算法,以保证数据传输的正确性和完整性。
    发表于 06-05 14:25 463次阅读
    <b>单片机</b>中几种常见的<b>校验算法</b>介绍