C语言实例_异或校验算法

一、异或校验算法

异或校验算法(XOR校验)是一种简单的校验算法,用于检测数据在传输或存储过程中是否发生了错误。通过将数据中的所有比特位相异或,生成一个校验码,然后将该校验码与接收到的数据进行比较,以确定数据是否被修改或损坏。

异或校验算法的计算过程如下:

(1)将待校验的数据按比特位进行异或操作。

(2)将得到的结果作为校验码。

在接收端,通过执行相同的异或校验算法,将接收到的数据再次计算校验码,并将其与发送端生成的校验码进行比较。如果两个校验码一致,说明数据传输或存储没有发生错误;如果校验码不一致,则表明数据可能遭到了篡改或传输过程中发生了错误。

异或校验算法通常用于简单的数据完整性校验,例如:

(1)串口通信:在串口通信中,异或校验可以用于检测数据是否正确地从发送端传输到接收端。

(2)存储校验:在存储介质中,可以使用异或校验来验证数据的完整性,确保数据在读写过程中没有发生损坏。

(3)网络通信中的校验:在某些通信协议中,也会使用异或校验来验证数据的正确性。

异或校验算法只能检测到奇数位的错误。如果传输或存储过程中发生了偶数位错误,该算法无法发现并纠正错误。因此,在更复杂的应用场景中,可能需要使用更强大的校验算法,如循环冗余校验(CRC)来提高错误检测的可靠性和纠错能力。

二、代码实现

场景:在单片机通信里,单片机需要向上位机发送数据。 封装两个函数,针对发送方和接收方使用,使用异或校验算法对数据进行验证。

2.1 发送方函数

cpp 复制代码
#include <stdio.h>

// 计算数据的异或校验码
unsigned char calculate_xor_checksum(const unsigned char* data, size_t length) {
    unsigned char checksum = 0;
    for (size_t i = 0; i < length; i++) {
        checksum ^= data[i];
    }
    return checksum;
}

// 发送数据并附加异或校验码
void send_data_with_xor_checksum(const unsigned char* data, size_t length) {
    // 计算异或校验码
    unsigned char checksum = calculate_xor_checksum(data, length);

    // 发送数据
    printf("发送数据:");
    for (size_t i = 0; i < length; i++) {
        printf("%02X ", data[i]);
    }
    printf(" 异或校验码:%02X\n", checksum);
}

int main() {
    unsigned char data[] = { 0x12, 0x34, 0x56, 0x78 };

    send_data_with_xor_checksum(data, sizeof(data));

    return 0;
}

2.2 接收方函数

cpp 复制代码
#include <stdio.h>

// 验证数据的异或校验码
int validate_xor_checksum(const unsigned char* data, size_t length, unsigned char checksum) {
    unsigned char calculated_checksum = calculate_xor_checksum(data, length);
    return (checksum == calculated_checksum);
}

// 接收数据并验证异或校验码
void receive_data_with_xor_checksum(const unsigned char* data, size_t length, unsigned char checksum) {
    printf("接收数据:");
    for (size_t i = 0; i < length; i++) {
        printf("%02X ", data[i]);
    }

    // 验证异或校验码
    if (validate_xor_checksum(data, length, checksum)) {
        printf(" 异或校验通过\n");
    } else {
        printf(" 异或校验失败\n");
    }
}

int main() {
    unsigned char received_data[] = { 0x12, 0x34, 0x56, 0x78 };
    unsigned char received_checksum = 0xAB;

    receive_data_with_xor_checksum(received_data, sizeof(received_data), received_checksum);

    return 0;
}

在发送方函数中,通过 calculate_xor_checksum 函数计算数据的异或校验码,然后将数据和校验码一起发送。在接收方函数中,通过 validate_xor_checksum 函数验证接收到的数据的异或校验码是否正确。

相关推荐
another heaven2 小时前
【C/C++ Ranges 是零开销抽象吗?拆开管道、惰性求值和编译期膨胀】
c语言·开发语言·c++
Code_Solitude2 小时前
C语言动态内存 + 柔性数组 + 数组名退化
c语言·算法·柔性数组
上海潭龙东海科技有限公司2 小时前
客运站管控之动态孪生技术方案(新增一屏管控模块
数据仓库·人工智能·算法·重构·动态规划
SomeOtherTime3 小时前
Rust 闭包语法和原理(AI回答)
开发语言·后端·rust
apcipot_rain3 小时前
C++转Java日记(10)
java·开发语言
总要学点什么4 小时前
第105篇:三维特效-流动图片墙体效果——让箭头沿墙长滚,它俩竟是同一份代码
开发语言·javascript·ecmascript·gis·webgl·材质·cesium
YLCHUP4 小时前
【思维&图论建模】题解:债权(debt)_图论_建模_思路转化_思维题目_C++算法竞赛
c++·笔记·算法·数学建模·贪心算法·深度优先·图论
xiaoye-duck4 小时前
《C++ 项目:手写大模型接入 SDK》会话模块整合:内存 SessionManager 与 DataManager 持久化联动
开发语言·数据库·c++·语言模型
思麟呀5 小时前
背包DP(01背包+完全背包)
c++·算法
Zwawa5 小时前
让屏幕动起来:OLED动画效果,丝滑光标、帧动画和一只贪吃蛇
c语言·单片机·嵌入式