C语言实例_奇偶校验算法

news2025/1/18 6:09:15

一、奇偶校验算法

奇偶校验算法(Parity Check Algorithm)是一种简单的错误检测方法,用于验证数据传输中是否发生了位错误。通过在数据中添加一个附加的奇偶位(即校验位),来实现错误的检测和纠正。

在奇偶校验算法中,假设每个字节由8个比特(位)组成。奇偶校验位的值取决于数据字节中的1的个数。如果数据字节中1的个数是偶数个,奇偶校验位被设置为0;如果1的个数是奇数个,奇偶校验位被设置为1。这样,在接收端,通过统计接收到的数据字节中1的个数,就可以检测出位错误。

具体的奇偶校验算法包括以下几个步骤:

(1)发送端:在发送数据字节之前,统计数据字节中1的个数,根据个数设置奇偶校验位的值,并将数据字节和奇偶校验位一起发送。

(2)接收端:在接收数据字节后,再次统计接收到的数据字节中1的个数,与接收到的奇偶校验位进行比较。如果两者不一致,说明数据传输中发生了位错误。

奇偶校验算法在以下场景中常被使用:

(1)串行通信:在串行通信中,奇偶校验算法可以用于检测数据传输过程中发生的位错误。发送端计算奇偶校验位并附加到发送的数据字节上,接收端通过验证奇偶校验位来判断接收到的数据是否正确。

(2)存储介质:在一些存储介质上,如磁盘驱动器或闪存存储器,奇偶校验算法可以用于检测数据读取或写入过程中发生的位错误。在存储数据时,计算奇偶校验位并与数据一起存储;在读取数据时,再次计算校验位并与存储的校验位进行比较,以确保数据的完整性和准确性。

(3)错误检测:奇偶校验算法也可以用于其他需要简单错误检测的场景。例如,在计算机内存或寄存器中,奇偶校验位可以用于检测存储数据过程中的位错误,以避免数据的错误使用或传输。

奇偶校验算法只能检测到位错误,而不能纠正错误。如果检测到错误,则需要采取其他纠错措施或请求重新传输数据。

image-20230626214339103

image-20230626214412782

二、代码实现

场景:在单片机通信里,单片机需要向上位机发送数据。 下面代码演示两个函数,针对发送方和接收方使用,使用奇偶校验算法对数据进行验证。

2.1 发送方函数

void sender_send_data_with_parity(unsigned char* data, int length) {
    // 统计数据字节中1的个数
    int count = 0;
    for (int i = 0; i < length; i++) {
        unsigned char byte = data[i];
        for (int j = 0; j < 8; j++) {
            if ((byte >> j) & 1) {
                count++;
            }
        }
    }

    // 计算奇偶校验位,如果1的个数是偶数,则校验位为0,否则为1
    unsigned char parity_bit = (count % 2 == 0) ? 0 : 1;

    // 发送数据字节和奇偶校验位
    for (int i = 0; i < length; i++) {
        send_byte(data[i]);
    }
    send_byte(parity_bit);
}

2.2 接收方函数

void receiver_receive_data_with_parity() {
    // 接收数据
    unsigned char received_data[MAX_LENGTH];
    int length = receive_data(received_data);

    // 统计接收到的数据字节中1的个数
    int count = 0;
    for (int i = 0; i < length - 1; i++) {
        unsigned char byte = received_data[i];
        for (int j = 0; j < 8; j++) {
            if ((byte >> j) & 1) {
                count++;
            }
        }
    }

    // 比较接收到的奇偶校验位与数据字节中1的个数是否一致
    unsigned char expected_parity_bit = (count % 2 == 0) ? 0 : 1;
    unsigned char received_parity_bit = received_data[length - 1];

    if (expected_parity_bit != received_parity_bit) {
        // 发生了位错误
        handle_error();
    } else {
        // 数据传输正常
        process_data(received_data, length - 1);
    }
}

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

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

相关文章

BGP知识点整理

BGP相关知识点 定义 又名&#xff1a;边界网关路由协议 属于无类别路径矢量协议 EGP—外部网关路由协议-包含BGP IGP内部网关路由协议-包含RIP OSPF EIGRP IGP协议追求&#xff1a;1、无环&#xff08;选路佳&#xff09; 2、收敛快 3、占用资源少 EGP协议的追求&#xff1a; 1…

照耀国产的星火,再度上新!

国产之光&#xff0c;星火闪耀 ⭐ 新时代的星火⭐ 多模态能力⭐ 图像生成与虚拟人视频生成⭐ 音频生成与OCR笔记收藏⭐ 助手模式更新⭐ 插件能力⭐ 代码能力⭐ 写在最后 ⭐ 新时代的星火 在这个快速变革的时代&#xff0c;人工智能正迅猛地催生着前所未有的革命。从医疗到金融…

当众讲话培训的需求分析

标题&#xff1a;当众讲话培训的需求分析 摘要&#xff1a;当众讲话是现代社会中一项重要的技能&#xff0c;对于个人和职业发展都具有重要意义。然而&#xff0c;许多人面临着当众讲话的困难和挑战。本论文旨在分析当众讲话培训的需求&#xff0c;探讨为什么人们需要这种培训…

【Java基础】Java对象的生命周期

【Java基础】Java对象的生命周期 一、概述 一个类通过编译器将一个Java文件编译为Class字节码文件&#xff0c;然后通过JVM中的解释器编译成不同操作系统的机器码。虽然操作系统不同&#xff0c;但是基于解释器的虚拟机是相同的。java类的生命周期就是指一个class文件加载到类…

C#__使用委托升级冒泡排序

// 员工类 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;namespace Delegate委托 {class Employee // 员工类{public string Name { get; set; }public double Salary { get; set; }public Employee…

二叉树的存储结构(链式存储)—— 数据结构与算法

&#x1f636;‍&#x1f32b;️Take your time ! &#x1f636;‍&#x1f32b;️ &#x1f4a5;个人主页&#xff1a;&#x1f525;&#x1f525;&#x1f525;大魔王&#x1f525;&#x1f525;&#x1f525; &#x1f4a5;代码仓库&#xff1a;&#x1f525;&#x1f525;魔…

进行 200 瓦太阳能 (PV) 模块设计以测量太阳能光伏阵列的电压、电流和功率、综合负荷频率和电压控制系统的方法研究(Simulink实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

pycharm调整最大堆发挥最大

python程序运行时&#xff0c;怎么提高效率&#xff0c;设置pycharm最大堆过程如下&#xff1b; 一、进入设置pycharm最大堆&#xff1b; 二、进入设置pycharm最大堆&#xff1b; 如果8g设置为6g左右&#xff0c;占75%左右最佳

问题记录和细节补充

【问题记录】ORA-01400: 无法将 NULL 插入 Ajax 调用为Execute Server-Side Code返回了服务器错误ORA-01400: 无法将 NULL 插入 ("YWJA"."DEPT_TEST_WXX2"."DEPT_ID")。 原因&#xff1a;主键非自增&#xff0c;输入时并未有主键值传递&#x…

串是什么,串存储结构的3种实现方法

目录 串是什么&#xff0c;串存储结构的3种实现方法 串存储结构的具体实现 串的堆分配存储结构 串的块链存储结构 串是什么&#xff0c;串存储结构的3种实现方法 数据结构中&#xff0c;字符串要单独用一种存储结构来存储&#xff0c;称为串存储结构。这里的串指的就是字符…

判断Series序列是否含有空值NaN的Series.hasnans方法

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 判断Series序列是否含有空值NaN Series.hasnans [太阳]选择题 关于以下代码的说法中正确的是? import pandas as pd import numpy as np a pd.Series([1,np.nan],index["a","…

“想都是问题,干才是答案”是错误的,雷军说也不行

前几天&#xff0c;在为什么过去十年AI创业失败了一文中提了一个观点&#xff1a; “干就完了”式思维&#xff0c;是新式的刻舟求剑&#xff0c;剧毒&#xff0c;谁吃谁死。 没想到没过几天雷老板一个演讲又把这点炒到各个媒体的头条上&#xff0c;比如&#xff1a;“雷军20…

关于月球深层内部的谜团依然存在

地球物理数据表明&#xff0c;月球地幔的底部部分熔融或含有钛铁矿&#xff0c;但改进的流变学模型使这一层的存在受到质疑。 月球的内部结构只能使用远程地球物理数据来约束。一项新的分析表明&#xff0c;月球地幔深处的一个独特层&#xff0c;靠近深层月震发生的地方&#x…

大数据:Numpy基础应用详解

Numpy基础应用 Numpy 是一个开源的 Python 科学计算库&#xff0c;用于快速处理任意维度的数组。Numpy 支持常见的数组和矩阵操作&#xff0c;对于同样的数值计算任务&#xff0c;使用 NumPy 不仅代码要简洁的多&#xff0c;而且 NumPy 的性能远远优于原生 Python&#xff0c;…

小米平板6 Max 14评测:4窗口显示就是爽 多任务体验可媲美PC

一、前言&#xff1a;小米发布新款14英寸超大屏平板 专注生产力体验 加上网课、居家办公的普及&#xff0c;再加上各大手机厂商都开始搭建起自家的生态&#xff0c;尤其平板这个以往不被重视的品类&#xff0c;也开始找到了它自身的定位。 尤其在2023年上半年发布的小米平板6 P…

深入理解Vue 3.0x中的Suspense和异步组件

深入理解Vue 3.0x中的Suspense和异步组件 Vue 3.0x作为Vue.js框架的最新版本&#xff0c;引入了许多创新特性&#xff0c;其中Suspense和异步组件是重要的改进之一。在本文中&#xff0c;我们将深入探讨这两个特性&#xff0c;了解它们如何为现代Web应用带来更好的性能和用户体…

【C++11保姆级教程】final和override

文章目录 前言一、final关键字的使用1.1final关键字修饰类1.2final关键字修饰成员函数 1.3final的优势1.4final的劣势二、override关键字的使用2.1使用override关键字重写虚函数2.3override的优势 总结 前言 在C编程中&#xff0c;我们常常需要使用继承和多态来构建复杂的程序…

TTS | VocGAN声码器训练自己的数据集

哈喽&#xff0c;今天给大家介绍的是如何使用VocGAN声码器训练自己的数据集。 原文 VocGAN: A High-Fidelity Real-time Vocoder with a Hierarchically-nested Adversarial Network 想要论文解读&#xff0c;请参考我的这篇文章~ 本博客主要包括以下内容&#xff1a; 目录…

如何将短视频做成动态图?教你快速gif制作的方法

将产品或服务的短视频转换为gif图像后&#xff0c;可以在网站、电子邮件或社交媒体广告中使用&#xff0c;以吸引潜在客户的兴趣&#xff0c;那么怎么才能把短视频转gif图片呢&#xff1f;当然是使用专业的短视频转gif工具&#xff08;在线视频转换gif-视频转gif转换器-gif.cn_…

C语言,结构体,结构体大小,

1、结构体&#xff1a; 用于存储不同数据类型的多个相关变量&#xff0c;从而形成一个具有独立性的组合数据类型。 结构体的声明&#xff1a; struct 结构体类型名{ 数据类型 成员1&#xff1b; 数据类型 成员2&#xff1b; 数据类型 成员3&#xff1b; ……… }&#xff1…