C语言实现简单CRC校验

14 篇文章 3 订阅

目录

一、实现题目 

二、send模块

三、receive模块 

四、运行截图


一、实现题目 

 

二、send模块

#include <stdio.h>
#include <string.h>

// 执行模2除法,并计算出余数(CRC校验码)
//dividend被除, divisor除数 
void divide(char *dividend, const char *divisor, char *remainder) {
    int len_divisor = strlen(divisor);
    int len_dividend = strlen(dividend);

    strncpy(remainder, dividend, len_divisor); //将dividend前四位赋值给remainder
    remainder[len_divisor] = '\0';

    // 与运算 
    for (int i = 0; i <= len_dividend - len_divisor; ++i) {
        if (remainder[0] == '1') {
            for (int j = 1; j < len_divisor; ++j) {
                remainder[j] = ((remainder[j] == divisor[j]) ? '0' : '1');
            }
        }
        // 将余数左移 1 位并降低被除数的下一位
        memmove(remainder, remainder + 1, len_divisor - 1);
        remainder[len_divisor - 1] = dividend[i + len_divisor];
        remainder[len_divisor] = '\0';
    }
}

int main() {
    char original_message[1024]; // 原始信息
    char generator[1024]; // 生成多项式G(x)

    printf("请输入待发送的信息: ");
    scanf("%s", original_message);

    printf("请输入生成多项式: ");
    scanf("%s", generator);

    int message_len = strlen(original_message);
    int generator_len = strlen(generator);

    // 扩展信息长度以放置CRC校验码
    char extended_message[message_len + generator_len];
    strcpy(extended_message, original_message); //将extended_message=original_message
    memset(extended_message + message_len, '0', generator_len - 1);//扩充三个零(针对题目来说)
    extended_message[message_len + generator_len - 1] = '\0';//字符串以/0结尾

    char crc[generator_len];// crc余数的长度
    divide(extended_message, generator, crc);

    // 将CRC校验码附加到原始信息后面
    char final_message[message_len + generator_len];
    strcpy(final_message, original_message);
    strcat(final_message, crc);

    printf("待发送的信息: %s\n", original_message);
    printf("生成多项式: %s\n", generator);
    printf("CRC校验码: %s\n", crc);
    printf("要发送的信息: %s\n", final_message);

    // 打开文件并写入要发送的信息
    FILE *file = fopen("D:\\上机程序\\计网\\CRC\\CRCcode.txt", "w");
    if (file == NULL) {
        perror("无法打开文件");
        return 1;
    }
    fprintf(file, "%s", final_message);
    fclose(file);

    printf("信息已经写入到 D:\\上机程序\\计网\\CRC\\CRCcode.txt\n");

    return 0;
}

三、receive模块 

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void divide(char *dividend, const char *divisor, char *remainder) {
    int len_divisor = strlen(divisor);
    int len_dividend = strlen(dividend);

    strncpy(remainder, dividend, len_divisor);
    remainder[len_divisor] = '\0';

    for (int i = 0; i <= len_dividend - len_divisor; ++i) {
        if (remainder[0] == '1') {
            for (int j = 1; j < len_divisor; ++j) {
                remainder[j] = ((remainder[j] == divisor[j]) ? '0' : '1');
            }
        }
        memmove(remainder, remainder + 1, len_divisor - 1);
        remainder[len_divisor - 1] = i + len_divisor < len_dividend ? dividend[i + len_divisor] : '0';
        remainder[len_divisor] = '\0';
    }
}

int main() {
    const char *filepath = "D:\\Z上机程序\\计网\\CRC\\CRCcode.txt";
    char received_message[1024];
    char generator[1024];
    FILE *file = fopen(filepath, "r");

    if (file == NULL) {
        perror("无法打开文件");
        return 1;
    }

    printf("请输入生成多项式: ");
    scanf("%s", generator);

    if (fgets(received_message, sizeof(received_message), file) == NULL) {
        perror("读取文件失败");
        fclose(file);
        return 1;
    }
    fclose(file);
    
    printf("接收到的信息:%s",received_message);

    int generator_len = strlen(generator);
    char crc[generator_len];
    divide(received_message, generator, crc);

    // 检查CRC校验码是否为0
    int error_found = 0;
    for (int i = 0; i < generator_len - 1; ++i) {
        if (crc[i] != '0') {
            error_found = 1;
            break;
        }
    }

    if (error_found) {
        printf("检测到误码。\n");
    } else {
        printf("未检测到误码。\n");
    }

    printf("产生的余数(CRC校验码): %s\n", crc);

    return 0;
}

四、运行截图

 

  • 9
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

脑子不好真君

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值