常见校验算法介绍

文章目录

    • 一、奇偶校验
    • 二、 校验和
    • 三、 BCC(Block Check Character,块校验字符)校验
    • 四、CRC(循环冗余校验)
    • 五、海明码校验
    • 六、MD5(消息摘要算法第五版)和 SHA(安全哈希算法)系列

一、奇偶校验

  • 原理
    • 它是依据数据里二进制位中“1”的数量的奇偶特性来进行校验的,包含奇校验与偶校验这两种方式。在奇校验里,要保证数据中“1”的个数是奇数;偶校验则要确保数据中“1”的个数是偶数。
  • 优点
    • 实现起来非常简单,对硬件要求不高,所以硬件成本低。而且计算过程很简便,计算开销极小,只需要进行一次异或运算就能确定数据的奇偶性。
  • 缺点
    • 它的检测能力有很大局限性,只能检测出奇数位的数据错误,当出现偶数位错误时就无法检测到。并且不能确定错误发生的具体位置,也没办法对错误进行纠正。
  • 应用领域
    • 在早期计算机内存以及一些对错误检测要求不高的简单数据传输场景中被使用。
  • 网页工具
    • 链接:https://www.23bei.com/tool/625.html
  • 以下是奇偶校验的 C 代码示例:
// 奇校验
int oddParityCheck(unsigned char data) {int count = 0;for (int i = 0; i < 8; i++) {if (data & (1 << i)) {count++;}}return count % 2;
}// 偶校验
int evenParityCheck(unsigned char data) {int count = 0;for (int i = 0; i < 8; i++) {if (data & (1 << i)) {count++;}}return!(count % 2);
}

二、 校验和

  • 原理

    • 把数据的各个字节进行相加从而得出一个和值,之后通常会将这个和值截断成为固定的位数,以此作为校验的依据。
  • 优点

    • 计算方法简单直接,计算速度快,相应的计算开销也很小。在对数据准确性要求不是特别高、但需要快速进行简单校验的场景中很适用。
  • 缺点

    • 检测错误的能力比较弱,对于很多复杂的错误情况无法准确检测,并且和奇偶校验一样,不能纠正检测到的错误。
  • 应用领域

    • 常用于网络数据包校验以及一些简单的文件校验等场景,在这些场景中主要起到初步筛查数据完整性的作用。
  • 网页工具

    • 链接:https://www.metools.info/code/c128.html
  • 以下是校验和的 C 代码示例:

unsigned short checksum(unsigned char *data, int len) {unsigned int sum = 0;for (int i = 0; i < len; i++) {sum += data[i];}return (sum & 0xFFFF) + (sum >> 16);
}

三、 BCC(Block Check Character,块校验字符)校验

  • 原理
    • BCC 校验通常是对一组数据块中的每个字节进行特定的运算(如异或运算等),得到一个校验字符。这个校验字符与数据块一起传输或存储,在接收端对数据块进行同样的运算,将得到的结果与接收到的校验字符进行比较,以判断数据是否在传输或存储过程中发生错误。
  • 优点
    • 计算相对简单,实现起来比较容易。对于一些特定的数据格式和传输场景,能够快速有效地进行错误检测。
    • 可以针对不同的数据块大小进行灵活调整,适应多种应用场景。
  • 缺点
    • 错误检测能力有限,通常只能检测出部分错误类型,对于一些复杂的错误情况可能无法准确检测。
    • 像其他一些简单校验方法一样,不能定位错误的具体位置,也无法进行纠错。
  • 应用领域
    • 在一些简单的通信协议中,尤其是对数据准确性要求不是特别高,但需要快速进行初步错误检测的场景,如某些工业控制通信、小型嵌入式系统的数据传输等。
  • 网页工具
    • 链接:http://www.ip33.com/bcc.html
  • 以下是一个简单的 BCC(异或运算实现)的 C 代码示例:
unsigned char calculateBCC(unsigned char *data, int len) {unsigned char bcc = 0;for (int i = 0; i < len; i++) {bcc ^= data[i];}return bcc;
}

四、CRC(循环冗余校验)

  • 原理
    • 把待校验的数据看作一个二进制多项式,选择一个特定的生成多项式。将数据多项式乘以 x n x^n xn n n n 为生成多项式的长度减 1)后,用生成多项式对其进行模 2 除法运算,得到的余数就是 CRC 校验码,最后将校验码附加到原始数据上进行传输或存储。
  • 优点
    • 具有较强的检测错误能力,可以检测多种类型的错误如随机错误、突发错误等。同时计算速度较快,能够利用硬件快速实现,而且可以通过选择不同的生成多项式灵活地适应各种应用和数据类型,计算开销相对而言比较小。
  • 缺点
    • 不能对错误进行纠正,并且对于某些特定的错误模式可能无法检测出来。
  • 应用领域
    • 在网络通信领域用于确保数据在传输过程中的完整性、存储系统中保障数据存储准确以及文件传输时检测数据是否出错等。
  • 网页工具
    • 链接:https://www.lddgo.net/encrypt/crc
  • 以下是简单的 CRC 校验的 C 代码示例(以 CRC-8 为例):
unsigned char crc8_table[] = {0x00, 0x07, 0x0E, 0x09, 0x1C, 0x1B, 0x12, 0x15,0x38, 0x3F, 0x36, 0x31, 0x24, 0x23, 0x2A, 0x2D,0x70, 0x77, 0x7E, 0x79, 0x6C, 0x6B, 0x62, 0x65,0x48, 0x4F, 0x46, 0x41, 0x54, 0x53, 0x5A, 0x5D,0xE0, 0xE7, 0xEE, 0xE9, 0xFC, 0xFB, 0xF2, 0xF5,0xD8, 0xDF, 0xD6, 0xD1, 0xC4, 0xC3, 0xCA, 0xCD,0x90, 0x97, 0x9E, 0x99, 0x8C, 0x8B, 0x82, 0x85,0xA8, 0xAF, 0xA6, 0xA1, 0xB4, 0xB3, 0xBA, 0xBD
};unsigned char crc8(unsigned char *data, int len) {unsigned char crc = 0;for (int i = 0; i < len; i++) {crc = crc8_table[crc ^ data[i]];}return crc;
}

五、海明码校验

  • 原理
    • 在原始数据中添加若干个校验位,按照特定的编码规则,使数据位和校验位之间建立起特定的关系。在接收端依据这些关系来检测错误并且纠正错误。
  • 优点
    • 纠错能力强大,不仅能够检测到数据中是否存在错误,还能精准确定错误的位置并且进行纠正。检测错误的能力也很全面,可以应对多种类型的错误情况。
  • 缺点
    • 计算过程比较复杂,编码和解码过程都需要进行大量计算,所以计算开销较大。并且因为要添加校验位,会导致数据冗余度增大,增加了数据传输量和存储量。
  • 应用领域
    • 在对数据可靠性有极高要求的领域,例如航空航天领域中保障飞行数据准确、军事领域确保关键信息无误等场景发挥重要作用。
  • 网页工具
    • 链接:https://www.23bei.com/tool/141.html
  • 以下是一个简单的海明码编码的 C 代码示例(只是示意,实际应用可能需要更复杂的处理):
#include <stdio.h>
#include <math.h>int calculateParityBit(int *data, int bitPosition, int dataLength) {int count = 0;for (int i = bitPosition - 1; i < dataLength; i += (2 * bitPosition)) {for (int j = 0; j < bitPosition && i + j < dataLength; j++) {if (data[i + j]) {count++;}}}return count % 2;
}void encodeHammingCode(int *data, int dataLength) {int totalLength = dataLength + (int)ceil(log2(dataLength)) + 1;int *encodedData = (int *)malloc(totalLength * sizeof(int));int j = 0;for (int i = 1; i <= totalLength; i++) {if (i == (int)pow(2, j)) {encodedData[i - 1] = 0;j++;} else {encodedData[i - 1] = data[i - j - 1];}}j = 0;for (int i = 1; i <= totalLength; i++) {if (i == (int)pow(2, j)) {encodedData[i - 1] = calculateParityBit(encodedData, i, totalLength);j++;}}printf("Encoded Hamming Code: ");for (int i = 0; i < totalLength; i++) {printf("%d", encodedData[i]);}printf("\n");free(encodedData);
}

六、MD5(消息摘要算法第五版)和 SHA(安全哈希算法)系列

  • 原理
    • 通过一系列复杂的数学运算对输入的数据进行处理,最终生成固定长度的哈希值。只要输入数据稍有不同,生成的哈希值就会有很大差异。
  • 优点
    • 安全性很高,很难通过哈希值反向推导出原始数据,并且可以有效地用于检测数据的完整性,判断数据是否被篡改过。
  • 缺点
    • 计算过程复杂,计算开销较大。并且只能检测数据是否被篡改,不能对错误数据进行纠正。
  • 应用领域
    • 在文件校验方面可以确保文件在传输、存储等过程中不被破坏或篡改;在数字签名领域保障签名的安全性和可靠性;在密码存储方面能够对用户密码进行加密处理等。
  • 网页工具
    • 链接:https://www.metools.info/other/o21.html
  • 使用 OpenSSL 库可以实现 MD5 和 SHA 系列算法,以下是 MD5 的示例代码:
#include <stdio.h>
#include <openssl/md5.h>void print_md5_sum(unsigned char *digest) {for (int i = 0; i < MD5_DIGEST_LENGTH; i++) {printf("%02x", digest[i]);}printf("\n");
}int main() {const char *string = "Hello, World!";unsigned char digest[MD5_DIGEST_LENGTH];MD5_CTX ctx;MD5_Init(&ctx);MD5_Update(&ctx, string, strlen(string));MD5_Final(digest, &ctx);print_md5_sum(digest);return 0;
}

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

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

相关文章

1688商品评论接口技术深度解析与实战代码实现

引言 在电商领域&#xff0c;商品评论是消费者购物决策的重要依据。1688作为国内领先的B2B电商平台&#xff0c;提供了丰富的商品评论接口&#xff0c;供商家和开发者获取、管理并展示商品评论数据。本文将详细介绍如何调用1688商品评论接口&#xff0c;并提供Python实战代码示…

系统架构设计师教程 第16章 16.1 嵌入式系统概述 笔记

16.1 嵌入式系统概述 嵌入式系统 (Embedded System) 是为了特定应用专门构建的计算机系统&#xff0c;其架构是随着嵌入式系统的逐步应用而发展形成。 16.1.1 嵌入式系统发展历程 五个阶段&#xff1a; 一&#xff1a;单片微型计算机 (SCM) 阶段&#xff0c;即单片机时代。…

小猿口算自动PK脚本

大家好&#xff0c;我是小黄。 近期&#xff0c;众多大学生炸鱼小猿口算APP,把一众小学生都快虐哭了&#xff0c;小黄听闻后&#xff0c;也跃跃欲试。对此小黄也参考网上的资料写了一个自动Pk的脚步。 首先大家需要安装一个pytorch环境过程中&#xff0c;如果小伙伴对此不熟悉的…

C语言-输入输出

实验一&#xff1a;编写一个输出两行自定义字符的 C 程序 一、实验目的 熟悉 C 语言的基本结构和语法。掌握 printf() 函数的使用方法。了解在 Code::Blocks 中编写、编译和运行程序的过程。 二、实验内容 编写一个 C 程序&#xff0c;要求输出两行字符&#xff0c;内容自定…

软考《信息系统运行管理员》- 4.3 信息系统软件运维的过程

4.3 信息系统软件运维的过程 文章目录 4.3 信息系统软件运维的过程日常运维日常运维的内容日常运行例行测试维护例行测试流程的关键点例行维护流程的关键点 定期测试维护 缺陷诊断与修复信息系统软件缺陷的概念信息系统软件缺陷的分类信息系统软件缺陷诊断与修复流程缺陷诊断与…

springboot kafka多数据源,通过配置动态加载发送者和消费者

前言 最近做项目&#xff0c;需要支持kafka多数据源&#xff0c;实际上我们也可以通过代码固定写死多套kafka集群逻辑&#xff0c;但是如果需要不修改代码扩展呢&#xff0c;因为kafka本身不处理额外逻辑&#xff0c;只是起到削峰&#xff0c;和数据的传递&#xff0c;那么就需…

Koa学习

Koa 安装与配置 1. 初始化项目 在终端中执行以下命令&#xff1a; # 创建项目文件夹 mkdir koa cd koa# 初始化并安装依赖 npm init -y npm install koa npm install nodemon --save-dev2. 修改 package.json 在 package.json 文件中进行如下修改&#xff1a; {"type…

llava论文阅读

论文名称是 Visual Instruction Tuning 视觉指令微调 摘要 我们首次尝试仅使用语言模型GPT-4来生成多模态的语言-图像指令跟随数据。 通过在生成的数据上进行指令微调&#xff0c;我们引入了LLaVA&#xff08;Large Language and Vision Assistant&#xff09;&#xff1a;一…

c++基础知识复习(1)

前期知识准备 1 构造函数 &#xff08;1&#xff09;默认构造函数&#xff1a;没有参数传入&#xff0c;也没有在类里面声明 &#xff08;2&#xff09;手动定义默认构造函数&#xff1a;没有参数传入&#xff0c;但是在类里面进行了声明 可以在类外实现或者类内实现 以下案…

【Windows】 C++实现 Socket 通讯

【Windows】 C实现 Socket 通讯 一&#xff1a;头文件与套接字实例 &#xff08;1&#xff09;Windows 系统下所需头文件 &#xff1a; #include<WinSock2.h>  &#xff08;2&#xff09;我们使用 SOCKET 来作为套接字的实例&#xff1a;通过查看源码得知其是一个无符号…

计算机网络803-(4)网络层

目录 1.虚电路服务 虚电路是逻辑连接 2.数据报服务 3.虚电路服务与数据报服务的对比 二.虚拟互连网络-IP网 1.网络通信问题 2.中间设备 3.网络互连使用路由器 三.分类的 IP 地址 1. IP 地址及其表示方法 2.IP 地址的编址方法 3.分类 IP 地址 &#xff08;1&#x…

LabVIEW中的非阻塞定时器

在LabVIEW编程中&#xff0c;通常需要在某些任务执行过程中进行非阻塞的延时操作。例如&#xff0c;显示某条信息一段时间&#xff0c;同时继续执行其他任务&#xff0c;并在延时时间结束后停止显示该信息。这类需求通常用于处理优先级不同的信息显示&#xff0c;如错误信息需要…

【Arduino IDE安装】Arduino IDE的简介和安装详情

目录 &#x1f31e;1. Arduino IDE概述 &#x1f31e;2. Arduino IDE安装详情 &#x1f30d;2.1 获取安装包 &#x1f30d;2.2 安装详情 &#x1f30d;2.3 配置中文 &#x1f30d;2.4 其他配置 &#x1f31e;1. Arduino IDE概述 Arduino IDE&#xff08;Integrated Deve…

Jupyter的使用分享

文章目录 碎碎念安装方法1.安装Anaconda方法2.通过库的安装方式 启动使用教程1.指定目录打开2.启动后的简单使用 小结 碎碎念 前情提示 之前与许多小伙伴交流的时候&#xff0c;发现大家对于pycharm更容易上手&#xff08;可能是比较好设置中文的原因&#xff09;&#xff0c;在…

算法: 前缀和题目练习

文章目录 前缀和题目练习前缀和二维前缀和寻找数组的中心下标除自身以外数组的乘积和为 K 的子数组和可被 K 整除的子数组连续数组矩阵区域和 前缀和题目练习 前缀和 自己写出来了~ 坑: 数据太大,要用long. import java.util.Scanner;public class Main {public static voi…

vue中用echarts做一个躺着的柱状图

在 Vue 中集成 ECharts 并绘制一个躺着的柱状图&#xff08;即横向的柱状图&#xff09;&#xff0c;你可以通过设置 ECharts 的 bar 类型&#xff0c;并配置 xAxis 和 yAxis 来实现。下面是一个完整的 Vue 示例代码。 示例代码&#xff1a; <template><div id"…

《C++编程新探索:实现高效视频拼接算法》

在当今数字化时代&#xff0c;视频内容的创作和处理变得越来越重要。视频拼接作为一种常见的视频处理技术&#xff0c;能够将多个视频片段组合成一个连续的视频&#xff0c;为视频创作者和用户带来了更多的可能性。本文将探讨如何在 C中实现高效的视频拼接算法&#xff0c;为开…

数据结构与算法JavaScript描述练习------第3章列表

1. 增加一个向列表中插入元素的方法&#xff0c;该方法只在待插元素大于列表中的所有元素时才执 行插入操作。这里的大于有多重含义&#xff0c;对于数字&#xff0c;它是指数值上的大小&#xff1b;对于字母&#xff0c;它 是指在字母表中出现的先后顺序。 function isGreate…

【element-tiptap】如何引进系统中的字体?

源码地址&#xff1a; https://github.com/Leecason/element-tiptap 源码中给出的字体如下 可以看到&#xff0c;咱们日常需要的黑体、微软雅黑等都没有&#xff0c;所以这篇文章来探索一下怎么加字体。 另外呢&#xff0c;肯定有小伙伴发现&#xff0c;这个按钮点击的时候&am…

IDEA 配置 Git 详解

本文将介绍在IntelliJ IDEA 中如何配置Git 没有安装配置 Git 的可以参考我的这篇文章&#xff1a;安装配置 Git 一、操作环境及准备 1.win 10 2.已安装且配置了Git 3.有Gitee账户 4.安装了IntelliJ IDEA 2023.2.1 5.全程联网 二、配置步骤 2.1 配置git 1.采用全局设置&…