嵌入式常用轻量级校验算法

news2024/9/24 9:17:29

        在嵌入式中涉及通信基本都需要用到校验算法,如:UART常用的奇偶校验、CAN通信常用的CRC校验等等。下面我们将介绍几种常用的校验算法:

一、校验和

        校验和是最基本,也是嵌入式软件工程师最常用的一种校验算法,其实现方法很简单,简单到只有几行代码。实现的方式方法很多,不同的编程语言,不同的应用有所不同,下面以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<Len; i++)  
        {    
            sum += *Buf++;  
        }
      checksum = sum & 0xff;
      return checksum;
}

二、异或校验

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

uint8_t CheckXOR(uint8_t *Buf, uint8_t Len)
{  
      uint8_t i = 0;  uint8_t x = 0;
      for(i=0; i<Len; i++)  
        {    
            x = x^(*(Buf+i));  
        }
          return x;
}

       校验和、异或校验的方式有很多种,比如有的还会传入一个参数作为异或校验的值。在实际使用中需要用户根据实际情况进行调整。

三、循环冗余校验

      CRC:Cyclic Redundancy Check,即循环冗余校验。CRC是数据通信领域中最常用的一种查错校验码,其特征是信息字段和校验字段的长度可以任意选定。循环冗余检查(CRC)是一种数据传输检错功能,对数据进行多项式计算,并将得到的结果附在帧的后面,接收设备也执行类似的算法,以保证数据传输的正确性和完整性。(来自网络)CRC有多种变体,比如:CRC-1、 CRC-5-USB、 CRC-8、 CRC-16、 CRC-32、 CRC-64等。其中,在嵌入式领域,CRC-16用的比较多。常见CRC参数模型:

图片

比如一种在单片机上实现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<Len; i++)  {
        index = crc_h^*(pData + i);    
        crc_h = crc_l^CRCTAB_H[index];    
        crc_l = CRCTAB_L[index];  
    }
    *CRC_H = crc_h;  
    *CRC_L = crc_l;
}

       CRC校验不同场景实现方式不同,网上也有很多公开的库和源码,比如:LibCRC – C语言中的开源CRC库:https://github.com/lammertb/libcrc。

四、MD5校验

        MD5,是一个将任意长度的数据字符串转化成短的固定长度的值的单向操作。任意两个字符串不应有相同的散列值(即,有“很大可能”是不一样的,并且要人为地创造出来两个散列值相同的字符串应该是困难的)。一个 MD5 校验和(checksum)通过对接收的传输数据执行散列运算来检查数据的正确性。计算出的散列值拿来和随数据传输的散列值比较。如果两个值相同,说明传输的数据完整无误、没有被窜改过(前提是散列值没有被窜改),从而可以放心使用。MD5校验可以应用多个领域,比如说机密资料的检验,下载文件的检验,明文密码的加密等。以下代码使用了OpenSSL库中的MD5函数来计算字符串或文件的MD5值。如需使用此代码请安装OpenSSL库。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <openssl/md5.h>

void calculate_md5(const char *file_path, unsigned char *md5_result) {
    FILE *file = fopen(file_path, "rb");
    if (!file) {
        perror("无法打开文件");
        exit(EXIT_FAILURE);
    }

    MD5_CTX md5_context;
    MD5_Init(&md5_context);

    unsigned char buffer[1024];
    size_t bytes_read;
    while ((bytes_read = fread(buffer, 1, sizeof(buffer), file)) != 0) {
        MD5_Update(&md5_context, buffer, bytes_read);
    }

    MD5_Final(md5_result, &md5_context);
    fclose(file);
}

void print_md5(unsigned char *md5_result) {
    for (int i = 0; i < MD5_DIGEST_LENGTH; i++) {
        printf("%02x", md5_result[i]);
    }
    printf("\n");
}

int main(int argc, char *argv[]) {
    if (argc != 2) {
        fprintf(stderr, "用法:%s <文件路径>\n", argv[0]);
        return EXIT_FAILURE;
    }

    unsigned char md5_result[MD5_DIGEST_LENGTH];
    calculate_md5(argv[1], md5_result);
    
    printf("%s 的MD5校验值是: ", argv[1]);
    print_md5(md5_result);

    return EXIT_SUCCESS;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2138582.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

jdk知识

jdk,jre,jvm jdk>jre>jvm jdk的bin目录下有编译工具&#xff0c;平时写完java文件用jdk编译&#xff1b; jre的lib文件夹里面是java的jar包(.class文件)&#xff0c;用来给jvm运行编译后的.class文件。 jvm&#xff1a;运行.class文件&#xff0c;.class文件读入到虚拟机…

JVM 垃圾回收机制和GC案例分析

1. 引言 Java 虚拟机&#xff08;JVM&#xff09;的垃圾回收&#xff08;Garbage Collection, GC&#xff09;机制&#xff0c;是自动内存管理的重要组成部分。它通过回收不再使用的对象&#xff0c;避免手动释放内存的麻烦。然而&#xff0c;随着系统复杂性的增加&#xff0c…

C/C++——野指针处理

在C++中,“野指针”(dangling pointer)指的是指向已释放或无效内存的指针。使用野指针可能导致程序崩溃或产生未定义行为。避免野指针的关键在于确保指针始终指向有效内存。下面是一些避免野指针的方法和最佳实践: 1、释放内存后置空指针 当释放掉分配的动态内存后,将指…

文本到3D生成

文本到3D生成是一种通过文本描述直接创建三维数字模型的技术。这种技术能够将语言描述转换成可视化的三维模型&#xff0c;使得内容创作者和设计师可以直接从概念阶段跳转到三维可视化&#xff0c;大大加快创作流程并提供更直观的设计和修改过程。 该技术的核心应用之一是基于…

【乐吾乐大屏可视化组态编辑器】使用手册

1 总览 开始设计&#xff1a;大屏可视化设计器 - 乐吾乐Le5le 1.1 画布 画布即绘画区域&#xff0c;将图形拖拽到画布进行编辑&#xff0c;绘制大屏。 1.2 菜单栏 顶部菜单导航&#xff0c;一级菜单可设置Logo、公司名称、文件编辑、常用编辑、查看、帮助&#xff0c;设置大…

MySQL篇(SQL - 分类)(持续更新迭代)

目录 简介 一、DDL 1. 简介 2. 数据库操作 2.1. 查库 查询所有数据库 查询当前数据库 2.2. 创库 2.3. 删库 2.4. 切库 3. 表操作 3.1. 查询 查询当前数据库所有表 查看指定表结构 查询指定表的建表语句 3.2. 创表 3.3. 改表 添加字段 修改数据类型 修改字段…

unity3d入门教程六

unity3d入门教程六 15.1预制体15.2编辑预制体15.3在场景中编辑15.4动态创建实例15.5实例的销毁16.1&#xff08;练习&#xff09;子弹发射16.2定时器16.3键盘事件 15.1预制体 火神山10天建成&#xff0c;使用了预制体技术 一个个小房间都是事先建造好的&#xff0c;最后吊车装…

Acrobat 2022 安装

软件介绍 Adobe Acrobat 是由Adobe公司开发的一款PDF&#xff08;Portable Document Format&#xff0c;便携式文档格式&#xff09;编辑软件。借助它&#xff0c;可以以PDF格式制作和保存文档&#xff0c;以便于浏览和打印&#xff0c;同时还可以使用一些高级工具来创建、编辑…

黑马十天精通MySQL知识点

一. MySQL概述 安装使用 MySQL安装完成之后&#xff0c;在系统启动时&#xff0c;会自动启动MySQL服务&#xff0c;无需手动启动。 也可以手动的通过指令启动停止&#xff0c;以管理员身份运行cmd&#xff0c;进入命令行执行如下指令&#xff1a; 1 、 net start mysql80…

Autosar E2E通信保护简介

文章目录 前言一、E2E基本概念二、为什么要做E2E?三、E2E保护的三种不同实现方式E2E TransformerE2E Protection Wrapper(E2EPW)COM E2E Callout四、E2E ProfileE2E Profile 01 机制E2E Profile 02 机制E2E Profile 04 机制E2E Profile 05 机制E2E Profile 06 机制E2E Profi…

828华为云征文|部署在线文件管理器 Spacedrive

828华为云征文&#xff5c;部署在线文件管理器 Spacedrive 一、Flexus云服务器X实例介绍1.1 云服务器介绍1.2 产品优势1.3 计费模式 二、Flexus云服务器X实例配置2.1 重置密码2.2 服务器连接2.3 安全组配置 三、部署 Spacedrive3.1 Spacedrive 介绍3.2 Docker 环境搭建3.3 Spac…

38900 机动车安全检测

参考文章&#xff1a;https://www.zhihu.com/question/458001000 机动车检查 《道路交通安全法实施条例》有关规定第十六条&#xff1a;机动车应当从注册登记之日起&#xff0c;按照下列期限进行安全技术检验&#xff1a; &#xff08;一&#xff09;营运载客汽车5年以内每年…

CSS 圆角渐变边框

<div class"contact-box"><div class"contact-item">联系我们</div> </div>.contact-item{width: 194px;height: 48px;border-radius: 20px 20px 20px 20px;background-color: #000000;color: #BDBDBD;font-weight: 500;font-size…

828华为云征文 | 华为云X实例服务器上部署知识图谱项目的详细指南

前言 知识图谱作为数据整合、语义分析和人工智能的重要基础&#xff0c;逐渐被广泛应用于各类领域。其通过结构化数据和关系映射&#xff0c;帮助用户更好地理解数据背后的意义。要成功构建和部署知识图谱项目&#xff0c;强大的计算资源和高效的存储查询能力至关重要。华为云X…

网易codeWave——新手如何使用多表头Excel导入数据

需求是需要将下面&#xff08;示例&#xff09;的多表头Excel表格&#xff0c;上传到服务器&#xff0c;展示在codeWave的表格组件内&#xff1a; 第一步下载官方插件&#xff1a; 可以先行查看文档再来 第二步&#xff1a; 选择一个上传组件 第三步&#xff0c;编写上传…

(1)LT9211学习笔记

文章目录 前言一、MIPI接口是什么&#xff1f;二、LT9211框图及应用1&#xff0c;作为MIPI发射机&#xff1a;2&#xff0c;作为双端口Lvds发射机3&#xff0c;作为TTL输出4&#xff0c;作为MIPI接收机&#xff1a;5&#xff0c;作为双端口Lvds接收机6&#xff0c;作为TTL输入 …

STM32(十三):通信协议——USART串口协议

通信接口 通信的目的&#xff1a;将一个设备的数据传送到另一个设备&#xff0c;扩展硬件系统。 通信协议&#xff1a;制定通信的规则&#xff0c;通信双方按照协议规则进行数据收发。 TX &#xff08;Transmit exchange&#xff09; 数据发送角 RX &#xff08;Receive ex…

GIS在线监测SF6密度微水传感器免焊接格兰头航插插头

概述 GIS&#xff08;气体绝缘金属封闭开关设备&#xff09;中的SF6&#xff08;六氟化硫&#xff09;气体密度微水传感器航插技术是指在GIS设备中安装SF6气体密度和微水传感器&#xff0c;以实现对SF6气体状态的在线监测。这些传感器能够实时监测SF6气体的密度、微水含量以及其…

通过SQL语句判断奇偶数的几种方法

文章目录 1. 准备数据2. 使用 % 判断奇偶数3. 使用 MOD 判断奇偶数4. 使用按位与运算符 & 1. 准备数据 假设我们有一张测试表test_numbers -- 创建测试表 CREATE TABLE test_numbers (number_value INT );-- 插入测试数据 INSERT INTO test_numbers (number_value) VALUE…

效率神器来了:AI工具手把手教你快速提升工作效能

随着科技的进步&#xff0c;AI工具已经成为提升工作效率的关键手段。本文将介绍一些实用的AI工具和方法&#xff0c;帮助你自动化繁琐的重复性任务、优化数据管理、促进团队协作与沟通&#xff0c;并提升决策质量。 背景&#xff1a;OOP AI-免费问答学习交流-GPT 自动化重复性任…