C语言实现简单CRC校验

news2024/12/27 11:41:33

目录

一、实现题目 

二、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;
}

四、运行截图

 

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

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

相关文章

maya blendshape

目录 shape编辑器 maya创建blendshape python 脚本 添加形变动画 查看顶点个数 shape编辑器 打开方式&#xff1a; 窗口-动画编辑器-形变编辑器 maya创建blendshape python 脚本 import maya.cmds as cmds# 创建基础网格 - 球体 baseMesh cmds.polySphere(name"bas…

计算机技术的发展与未来趋势

引言 随着科技的飞速发展&#xff0c;计算机技术已成为现代社会不可或缺的一部分。从最初的简单计算工具到如今的超级计算机、云计算、人工智能等技术的广泛应用&#xff0c;计算机技术的变革深刻影响着我们的生活和工作方式。本文将探讨计算机技术的发展历程、当前的应用领域…

【Qt】.ui文件转.h文件

1、打开qt命令行 2、转换 uic -o ui.h mainwindow.ui

2024HW --->蓝队面试题

这段时间在写横向移动&#xff0c;搞得鸽了很久&#xff08;内网真的很玄学&#xff09; 还没写完。。。 但是这不是准备HW了吗。小编也来整理一下自己收集到的题目吧&#xff01;&#xff01;&#xff01; &#xff08;仅为个人见解&#xff0c;不代表最终答案&#xff09;&…

Android 12 Starting window的添加与移除

添加&#xff1a; 04-13 16:29:55.931 2944 7259 D jinyanmeistart: at com.android.server.wm.StartingSurfaceController.createSplashScreenStartingSurface(StartingSurfaceController.java:87) 04-13 16:29:55.931 2944 7259 D jinyanmeistart: at com.android.server.wm.…

STM32H7使用FileX库BUG,SD卡挂载失败

问题描述&#xff1a; 使用STM32H7ThreadXFileX&#xff0c;之前使用swissbit牌的存储卡可正常使用&#xff0c;最近项目用了金士顿的存储卡&#xff0c;发现无法挂载文件系统。 原因分析&#xff1a; 调试过程发现&#xff0c;关闭D-Cache可以挂载使用exfat文件系统。 File…

edu邮箱官方购买渠道手把手选购指南记录

教育优惠&#xff0c;是一项针对于在校大学生和教职员工推出的特殊优惠活动。一些公司会将旗下产品或服务以一定的折扣&#xff0c;甚至免费提供给高校师生。想想自己上大学的时候啥都不知道,毕业后才发现浪费了这么多优秀的资源.如果你还是一名在校大学生&#xff0c;那么就不…

小程序总结

第一章 微信小程序概述 1.1 认识微信小程序 简介&#xff1a;微信&#xff08;WeChat)是腾讯公司于2011年1月21日推出的一款为智能终端提供即时通信服务的应用程序&#xff0c;于2017年1月上线。 优势&#xff1a;1. 无需安装 2. 触手可及 3. 用完即走 4. 无需卸载…

日志框架整合SpringBoot保姆级教程+日志文件拆分(附源码)

目录 介绍 日志概述 日志文件 调试日志 系统日志 日志框架 日志框架的作用 日志框架的价值 流行的日志框架 SLF4J日志门面 介绍 环境搭建简单测试 集成log4j logback Logback简介 Logback中的组件 Logback配置文件 日志输出格式 控制台输出日志 输出日志到…

WebServer项目介绍文章【四叶专属】

Linux项目实战C轻量级Web服务器源码分析TinyWebServer 书接上文&#xff0c;学习开源项目的笔记没想到居然有不少阅读量&#xff0c;后面结合另一个前端开源项目简单做了点修改&#xff0c;没想到居然有需要的同学&#xff0c;那么我就专门为四叶开一篇文章吧&#xff0c;【源码…

【网络编程】网络编程中的基本概念及Java实现UDP、TCP客户端服务器程序(万字博文)

系列文章目录 【网络通信基础】网络中的常见基本概念 【网络编程】网络编程中的基本概念及Java实现UDP、TCP客户端服务器程序&#xff08;万字博文&#xff09; 【网络原理】UDP协议的报文结构 及 校验和字段的错误检测机制&#xff08;CRC算法、MD5算法&#xff09; 文章目…

RANSAC 配准算法

RANSAC 配准算法 1. 简介2. RANSAC步骤3. RANSAC原理4. RANSAC的优缺点5. 代码实现6. 参考 1. 简介 先讲一下背景吧。 点云配准&#xff08;Point Cloud Registration&#xff09;指的是输入两幅点云 (source 和 target) &#xff0c;输出一个变换使得变换后的source和target…

【Unity】苹果(IOS)开发证书保姆级申请教程

前言 我们在使用xcode出包的时候&#xff0c;需要用到iOS证书(.p12)和描述文件(.mobileprovision) 开发证书及对应的描述文件用于开发阶段使用&#xff0c;可以直接将 App 安装到手机上&#xff0c;一个描述文件最多绑定100台测试设备 1.证书管理 进入网站Apple Developer &…

在ubuntu20.04下迁移anaconda的目录,试验不行后,换成软连接

一、原因 随着不断的搭建不同的算法环境&#xff0c;原本在固态硬盘上安装的anaconda上占用空间越来越多。导致可用的固态硬盘空间越来越少&#xff0c;又因安装的环境太多&#xff0c;重新搭建比较费时费力。有没有直接将当前已经搭建好环境的anaconda 迁移到另外的目录呢&…

程序员过了35岁没人要?“这行越老越香”

程序员35岁失业&#xff1f;参加完OceanBase开发者大会&#xff0c;我又悟了&#xff01; 周六参加了OceanBase2024 开发者大会的现场&#xff0c;来之前我其实挺忐忑的&#xff0c;我觉得一个数据库产品的发布会&#xff0c;能有什么新鲜的东西&#xff1f; 踏入酒店的那一刻&…

monorepo搭建记录

最终文件效果 1、准备环境 npm pnpm 2、创建文件夹npm init vite // 名字可以为main&#xff08;自定义&#xff09; 创建主应用main npm init vite // 名字可以为main monorepo下创建文件夹web 创建辅助应用 例&#xff1a;react-demo&#xff0c;具体步骤&#xff1a;1、 cd…

深入理解JavaScript:对象什么时候创建

&#x1f31f; 我们在chrome浏览器中debug程序。为了好debug我们会写一些在日常开发中基本不会采用的代码书写方式。 JavaScript中创建对象有3中方式&#xff1a; 1、对象字面量&#xff1b; 2、new&#xff1b; 3、Object.create(对象)&#xff1b; 1、使用new创建对象 fun…

10分钟揭秘摘要抽取:探索信息提炼的奥秘

Introduction 本文分别介绍摘要数据集&#xff0c;摘要分类&#xff0c;摘要架构&#xff0c;相关baseline。并介绍若干篇EMNLP2023论文&#xff0c;介绍其最新工作。 1.数据集 1.1 文本摘要 DUC/TAC 英文|数据集较小|适用于传统摘要方法的评估 Gigaword 英文|启发式规则构…

【数据结构与算法】8.二叉树的基本概念|前序遍历|中序遍历|后序遍历

&#x1f4da;博客主页&#xff1a;爱敲代码的小杨. ✨专栏&#xff1a;《Java SE语法》 | 《数据结构与算法》 | 《C生万物》 |《MySQL探索之旅》 |《Web世界探险家》 ❤️感谢大家点赞&#x1f44d;&#x1f3fb;收藏⭐评论✍&#x1f3fb;&#xff0c;您的三连就是我持续更…

【Linux】iptables的应用

iptables 防火墙 防火墙是一种网络安全系统&#xff0c;它位于内部网络与外部网络&#xff08;如互联网&#xff09;之间&#xff0c;通过实施预定义的安全策略来控制网络间的通信。防火墙的主要目标是保护内部网络资源免受未经授权的访问、攻击或潜在威胁&#xff0c;同时允…