数据一致性校验算法

  1. 数据完整性校验

在 数据录入、通信协议(CAN、LIN、Ethernet) 和 存储(Flash、EEPROM) 领域,数据校验(Error Checking) 是确保 数据完整性和正确性的关键技术

示例:当我们从互联网上下载的软件或者文件是否能打开,是否在传输过程中丢包决定了是否能使用和查看,很多资源站下载文件时会提供一个md5校验码,验证文件是否完整可以通过md5 文件获取到校验码,与下载站提供的校验码一致就能确定文件是完整的。

以下部分将提供几种常用的完整性校验的技术:

· 奇偶校验(Parity Check) - 用于简单错误检测

奇偶校验是一种简单的错误检测机制,它通过计算数据中 1 的个数来检查数据是否发 生错误。

适用于低速数据传输(如 LIN 总线、UART 通信)

常用于加密技术,如:des加密技术

奇偶校验的基本原理:

奇偶校验通过统计数据中1的个数,然后添加一位校验码,使得数据中1的总数为奇数(奇校验)或偶数(偶校验)。当接收方接 收到数据后,再次计算1的个数,并根据校验位的设置验证数据的完整性。如果检测到错误,接收方会要求重新发送数据

代码实现:

计算奇偶校验

uint8_t Compute_Parity(uint8_t data)

{

    uint8_t parity = 0;

    while (data)

    {

        parity ^= (data & 1);  // 计算 1 的个数

        data >>= 1;

    }

    return parity;

}

发送数据:

uint8_t data = 0x53; // 01010011

uint8_t parity = Compute_Parity(data);

uint8_t frame = (data << 1) | parity;  // 生成带校验位的数据

接收数据:

uint8_t received_data = frame >> 1;

uint8_t received_parity = frame & 1;

if (Compute_Parity(received_data) != received_parity)

{

    printf("数据错误!\n");

}

以DES技术实现原理为例:

DES特点

对称算法:加密和解密使用同一秘钥

分组加密算法:以64位为分组。64位明文输入,64位密文输出。

有效秘钥长度为56位秘钥通常表示为64位数,但每个第8位用作奇偶校验,可以忽略。

代替和置换DES算法是两种加密技术的组合:混乱和扩散。先替代后置换。

易于实现:DES算法只是使用了标准的算术和逻辑运算,其作用的数最多也只有64 位,因此用70年代末期的硬件技术很容易实现算法的重复特性使得它可以非常理想地用在一个专用芯片中。

可通过多重加密,提高安全等级

入口参数

Key为7个字节共56位,是DES算法的工作密钥

Data为8个字节64位,是要被加密或被解密的数据

Mode为DES的工作方式,有两种:加密或解密

基本原则

DES设计中使用了分组密码设计的两个原则:混淆(confusion)和扩散(diffusion),其目的是抗击敌手对密码系统的统计分析。

混淆是使密文的统计特性与密钥的取值之间的关系尽可能复杂化,以使密钥和明文以及密文之间的依赖性对密码分析者来说是无法利用的。

扩散的作用就是将每一位明文的影响尽可能迅速地作用到较多的输出密文位中,以便在大量的密文中消除明文的统计结构,并且使每一位密钥的影响尽可能迅速地扩展到较多的密文位中,以防对密钥进行逐段破译。

算法描述

输入64位明文数据,并进行初始置换IP

在初始置换IP后,明文数据再被分为L0和R0左右两部分,每部分32位

在秘钥的控制下,经过16轮运算(f)

16轮后,左、右两部分交换,并连接再一起,再进行逆置换

输出64位密文

DES算法过程

子密钥生成流程

DES算法由64位密钥产生16轮的48位子密钥。主要过程如下:

把密钥的奇偶校验位忽略不参与计算,即每个字节的第8位,将64位密钥降至56位,然后根据选择置换表PC-1将这56位分成两块C0(28位)和D0(28位)

将C0和D0进行循环左移变化(注:每轮循环左移的位数由轮数决定),变换后生成C1和D1,然后C1和D1合并,并通过选择置换表PC-2生成子密钥K1(48位)

C1和D1再次经过循环左移变换,生成C2和D2,然后C2和D2合并,通过选择置换PC-2生成密钥K2(48位)

以此类推,得到K16(48位)

· CRC 校验(Cyclic Redundancy Check) - 用于强校验

CRC(Cyclic Redundancy Check,循环冗余校验)是一种强大的错误检测机制,用于检测 数据传输 / 存储中的错误。

广泛应用于 CAN 总线、LIN、FlexRay、Ethernet、Flash 存储。

 CRC 校验步骤

发送端计算 CRC 值,并将其附加到数据帧。

接收端重新计算 CRC,如果计算出的 CRC 与收到的 CRC 不一致,则数据错误

Crc-8计算:

uint8_t CRC8_Table[256] = { /* 预计算的 CRC-8 查找表 */ };

uint8_t Compute_CRC8(uint8_t* data, uint8_t len)

{

    uint8_t crc = 0xFF;

    for (int i = 0; i < len; i++)

    {

        crc = CRC8_Table[crc ^ data[i]];

    }

    return crc;

}

发送crc:

uint8_t message[] = {0x12, 0x34, 0x56};

uint8_t crc = Compute_CRC8(message, sizeof(message));

message[3] = crc;  // 附加 CRC

接收crc:

uint8_t received_crc = message[3];

if (Compute_CRC8(message, 3) != received_crc)

{

    printf("数据错误!\n");

}

· Checksum(校验和) - 用于简单完整性校验

Checksum(校验和) 是一种简单的错误检测方法,它将 所有数据的二进制数值相加,并将 结果的低字节作为校验和。

三种完整性校验对比:

校验方法

适用场景

优点

缺点

奇偶校验

UART、LIN

计算简单

只能检测 1-bit 错误

Checksum

EEPROM、Flash

计算快,适合小数据

不能检测位翻转

CRC

CAN、Ethernet、UDS

高精度错误检测

计算复杂

根据业务具体场景选择使用哪种校验算法

  1. 数据可靠性传输

Tcp可靠性传输协议

通道的建立——三次握手:

(1)在建立通道时,客户端首先要向服务端发送一个SYN同步信号。

(2)服务端在接收到这个信号之后会向客户端发出SYN同步信号和ACK确认信号。

(3)当服务端的ACK和SYN到达客户端后,客户端与服务端之间的这个“通道”就会被建立起来。

通道的关闭——四次挥手:

(1)在数据传输完毕之后,客户端会向服务端发出一个FIN终止信号。

(2)服务端在收到这个信号之后会向客户端发出一个ACK确认信号。

(3)如果服务端此后也没有数据发给客户端时服务端会向客户端发送一个FIN终止信号。

(4)客户端在收到这个信号之后会回复一个确认信号,在服务端接收到这个信号之后,服务端与客户端的通道也就关闭了。

Tcp保证可靠性策略

· 确认应答机制(核心)

确认应答机制就是由Tcp报头字段中的32位序号和32位确认序号来保证的

注意:确认应答机制不是保证双方的通信的可靠性,而是通过收到对方应答,来保证一方通信的可靠性,但是如果双方都这样搞,就是间接保证了双方通信的可靠性

 确认应答机制前面已经大量涉及了,这里不再赘述了,只要记住,确认应答机制是Tcp保证可靠性的核心,或者说是基础,其余绝大部分的保证可靠性机制都是建立在确认应答机制基础上的

· 超时重传机制

定义:双方在进行网络通信时,发送方发出数据,如果在一个特定时间间隔内收不到应答,那么发送方就认为“我发的数据对方没有收到”,就会进行数据重发

附:Tcp保证可靠性一部分是通过Tcp协议报头体现出来的,还有一部分是通过实现Tcp的代码逻辑实现出来的,比如超时重传机制就是在发送方发出数据后开启了一个定时器,这就是通过Tcp的代码逻辑体现出来的,这在Tcp报头中是体现不出来的

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

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

相关文章

101个α因子#9

((0 < ts_min(delta(close, 1), 5)) ? delta(close, 1) : ((ts_max(delta(close, 1), 5) < 0) ? delta(close, 1) : (-1 * delta(close, 1))))worldquant brain平台上调整后的语法&#xff1a; ((0 < min(close-ts_delay(close, 1), ts_delay(close, 1)-ts_delay(c…

国产视频转换LT6211UX:HDMI2.0转LVDS/MIPI芯片简介,支持4K60Hz

1. LT6211UX HDMI2.0信号输入 支持HDMI2.0b, HDMI1.4和DVI1.0 支持HDCP2.2和HDCP1.4 数据速率高达6Gbps 自适应接收机均衡 支持4k60Hz 支持的3D格式&#xff1a; 对于HDMI -> LVDS&#xff1a; 直接3D输出 2路2D L/R输出 对于HDMI -> MIPI&#xff1a; 框架包装&#x…

华三(H3C)IRF堆叠心跳的LACP MAD、BFD MAD和ARP MAD差异

华三&#xff08;H3C&#xff09;IRF堆叠心跳的三种MAD&#xff08;多主检测&#xff09;机制——LACP MAD、BFD MAD和ARP MAD在实现原理、组网要求及适用场景上存在显著差异。以下是三者的对比分析&#xff1a; 一、核心区别对比 特性LACP MADBFD MADARP MAD检测原理扩展LAC…

宿州金博学校开展防震演练:夯实安全根基,守护校园平安

5月13日上午9点30分&#xff0c;金博学校原本宁静的校园被一阵急促的警报声打破&#xff0c;一场精心筹备、紧张有序的防震演练正式开启。本次演练意义重大&#xff0c;旨在强化全体师生的防震减灾意识&#xff0c;提高大家在地震突发时的应急反应与自我保护能力。 紧急避险&am…

DAY29 超大力王爱学Python

知识点回顾 类的装饰器装饰器思想的进一步理解&#xff1a;外部修改、动态类方法的定义&#xff1a;内部定义和外部定义 作业&#xff1a;复习类和函数的知识点&#xff0c;写下自己过去29天的学习心得&#xff0c;如对函数和类的理解&#xff0c;对python这门工具的理解等&…

RabbitMQ ④-持久化 || 死信队列 || 延迟队列 || 事务

消息确认机制 简单介绍 RabbitMQ Broker 发送消息给消费者后&#xff0c;消费者处理该消息时可能会发生异常&#xff0c;导致消费失败。 如果 Broker 在发送消息后就直接删了&#xff0c;就会导致消息的丢失。 为了保证消息可靠到达消费者并且成功处理了该消息&#xff0c;…

python打卡训练营打卡记录day31

知识点回顾 规范的文件命名规范的文件夹管理机器学习项目的拆分编码格式和类型注解 作业&#xff1a;尝试针对之前的心脏病项目ipynb&#xff0c;将他按照今天的示例项目整理成规范的形式&#xff0c;思考下哪些部分可以未来复用。 心脏病项目目录 目录结构:heart/ ├── conf…

mac .zshrc:1: command not found: 0 解决方案

nano ~/.zshrc 使用自带的nano命令打开文件&#xff0c;修改后 Ctrl X 然后输入y 然后回车即可保存成功 一般情况下&#xff0c;不是常用这个命令&#xff0c;除非是遇到有问题的文件&#xff0c;才用&#xff0c; 例如 遇到下面的问题 /Users/xxli/.zshrc:1: command no…

uniapp生成的app,关于跟其他设备通信的支持和限制

以下内容通过AI生成&#xff0c;这里做一下记录。 蓝牙 移动应用&#xff08;App&#xff09;通过蓝牙与其他设备通信&#xff0c;是通过分层协作实现的。 一、通信架构分层 应用层&#xff08;App&#xff09; 调用操作系统提供的蓝牙API&#xff08;如Android的BluetoothA…

第50天-使用Python+Qt+DeepSeek开发AI运势测算

1. 环境准备 bash 复制 下载 pip install pyside6 requests python-dotenv 2. 获取DeepSeek API密钥 访问DeepSeek官网注册账号 进入控制台创建API密钥 在项目根目录创建.env文件: env 复制 下载 DEEPSEEK_API_KEY=your_api_key_here 3. 创建主应用框架 python 复制…

上位机与Hid设备通信

前置知识 什么是HID&#xff1f; HID&#xff08;Human Interface Device&#xff09;是‌直接与人交互的电子设备‌&#xff0c;通过标准化协议实现用户与计算机或其他设备的通信&#xff0c;典型代表包括键盘、鼠标、游戏手柄等。‌ 为什么HID要与qt进行通信&#xff1f; …

JVM 工具实战指南(jmap / jstack / Arthas / MAT)

&#x1f50d; 从诊断到定位&#xff1a;掌握生产级 JVM 排查工具链 &#x1f4d6; 前言&#xff1a;系统故障时&#xff0c;如何快速定位&#xff1f; 无论 JVM 理论多么扎实&#xff0c;当线上服务出现 CPU 飙高、响应超时、内存泄漏或频繁 Full GC 时&#xff0c;仅靠猜测…

mac上安装 Rust 开发环境

1.你可以按照提示在终端中执行以下命令&#xff08;安全、官方支持&#xff09;&#xff1a; curl --proto https --tlsv1.2 -sSf https://sh.rustup.rs | sh然后按提示继续安装即可。 注意&#xff1a;安装过程中建议选择默认配置&#xff08;按 1 即可&#xff09;。 如果遇…

C++(5)switch语句 循环while

这是一个电影评分的程序 default 就是 如果上述的都没有执行 就统一的执行default的内容。 然后记得break ___________________________________ 循环 &#xff08;while&#xff09; while的使用方式 输出 0-9的while循环

[Linux] Linux线程信号的原理与应用

Linux线程信号的原理与应用 文章目录 Linux线程信号的原理与应用**关键词****第一章 理论综述****第二章 研究方法**1. **实验设计**1.1 构建多线程测试环境1.2 信号掩码策略对比实验 2. **数据来源**2.1 内核源码分析2.2 用户态API调用日志与性能监控 **第三章 Linux信号的用法…

25.5.20学习总结

做题思路 数列分段 Section IIhttps://www.luogu.com.cn/problem/P1182正如题目所说&#xff0c;我们需要得到一个最小的最大段的值&#xff0c;可能有人将注意力放在分段上&#xff0c;事实上&#xff0c;我们更多的应该关注结果。这是一道二分答案的题&#xff0c;你可以先确…

Python爬虫-爬取百度指数之人群兴趣分布数据,进行数据分析

前言 本文是该专栏的第56篇,后面会持续分享python爬虫干货知识,记得关注。 在本专栏之前的文章《Python爬虫-爬取百度指数之需求图谱近一年数据》中,笔者有详细介绍过爬取需求图谱的数据教程。 而本文,笔者将再以百度指数为例子,基于Python爬虫获取指定关键词的人群“兴…

【工具使用】STM32CubeMX-USB配置-实现U盘功能

一、概述 无论是新手还是大佬&#xff0c;基于STM32单片机的开发&#xff0c;使用STM32CubeMX都是可以极大提升开发效率的&#xff0c;并且其界面化的开发&#xff0c;也大大降低了新手对STM32单片机的开发门槛。     本文主要讲述STM32芯片USB功能的配置及其相关知识。 二…

从ISO17025合规到信创适配 解密质检lims系统实验室的 AI 质检全链路实践

在北京某国家级质检中心的 CMA 复评审现场&#xff0c;审核专家通过系统后台调取近半年的检测记录&#xff0c;从样品登记时的电子签名到报告签发的 CA 签章&#xff0c;178 项合规指标全部自动校验通过 —— 这是白码质检 LIMS 系统创造的合规奇迹。 一、智能合规引擎&#xf…

【操作系统】进程同步问题——生产者-消费者问题

问题描述 生产者进程负责生产产品&#xff0c;并将产品存入缓冲池&#xff0c;消费者进程则从缓冲池中取出产品进行消费。为实现生产者和消费者的并发执行&#xff0c;系统在两者之间设置了一个包含n个缓冲区的缓冲池。生产者将产品放入缓冲区&#xff0c;消费者则从缓冲区中取…