C语言实现简单CRC校验

目录

一、实现题目 

二、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前四位赋值给remainderremainder[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_messagememset(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校验码是否为0int 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.mzph.cn/bicheng/2687.shtml

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

相关文章

免费SSL证书和付费SSL证书区别在哪

免费SSL证书与付费SSL证书在多个方面存在差异&#xff0c;这些差异主要体现在认证级别、保障金额以及服务范围上。在以下几个方面存在显著区别&#xff1a; 1、验证类型和信任级别&#xff1a; 免费SSL证书&#xff1a;通常只提供域名验证&#xff08;DV&#xff09;级别的证…

实验:使用apache + yum实现自制yum仓库

实验准备 Web服务器端&#xff1a;cenos-1&#xff08;IP&#xff1a;10.9.25.33&#xff09; 客户端&#xff1a;centos-2 保证两台机器网络畅通&#xff0c;原yum仓库可用&#xff0c;关闭防火墙和selinux Web服务器端 ①安装httpd并运行&#xff0c;设置开机自启动 安装…

多模态模型

转换器成功作为构建语言模型的一种方法&#xff0c;促使 AI 研究人员考虑同样的方法是否对图像数据也有效。 研究结果是开发多模态模型&#xff0c;其中模型使用大量带有描述文字的图像进行训练&#xff0c;没有固定的标签。 图像编码器基于像素值从图像中提取特征&#xff0c;…

力扣数据库题库学习(4.23日)

610. 判断三角形 问题链接 解题思路 题目要求&#xff1a;对每三个线段报告它们是否可以形成一个三角形。以 任意顺序 返回结果表。 对于三个线段能否组成三角形的判定&#xff1a;任意两边之和大于第三边&#xff0c;对于这个表内的记录&#xff0c;要求就是&#xff08;x…

Maven基础篇7

私服-idea访问私服与组件上传 公司团队开发流程 本地上传–>repository–>私服 其他成员从私服拿 1.项目完成后发布到私服 在pom文件最后写上发布的配置管理 ​ //写发布的url也就是你发布到哪一个版本&#xff0c;以及写入id ​ ​ 发布的时候&#xff0c;将项…

安装Selenium

安装Selenium 【0】引言 ​ 由于sleenium4.1.0需要python3.7以上方可支持&#xff0c;请注意自己的python版本。 【1】使用Pycharm安装 使用 快捷键 Ctrl Alt S 【2】使用 pip 安装 Python3.x安装后就默认就会有pip&#xff08;pip.exe默认在python的Scripts路径下&…

VUE2版本的仿微信通讯录侧滑列表

<template><!-- Vue模板部分 --><div><div v-for"(group, index) in groupedArray" :key"index" ref"indexcatch"><h2>{{ letter[index] }}</h2><ul><li v-for"item in group" :key&quo…

Notepad++使用SFTP连接虚拟机编辑文档

一.前言 当我们在虚拟机中使用vim编辑有时候不太方便&#xff0c;可以使用远程工具连接进行编辑。 常用的远程连接编辑方式有 vscode下载remote-ssh插件notepad下载nppftp插件finallshell中可以直接打开文件编辑xftp软件 根据个人习惯去选择使用即可。 这里分享一下notepa…

模型训练时报错Failed to allocate 12192768 bytes in function ‘cv::OutOfMemoryError‘

目录 报错信息&#xff1a; 查找网上解决方法&#xff1a; 改进思路&#xff1a; 改进方法&#xff1a; 报错信息&#xff1a; D:\Programs\miniconda3\envs\python311\python.exe D:\python\project\VisDrone2019-DET-MOT\train.py Ultralytics YOLOv8.1.9 &#x1f680…

【Linux】gdb的简单使用

文章目录 一、gdb是什么&#xff1f;二、使用说明1. 安装2. 注意事项3. 常用调试指令3.1 gdb3.2 l3.3 r3.4 n3.5 s3.6 b3.7 info b3.8 finish3.9 p3.10 set var3.11 c3.12 d breakpoints3.13 d n3.14 disable/enable breakpoints3.15 disable/enable n3.16 info b3.17 display …

复习python函数

复习python函数 1.对函数的理解函数的传递方式返回值 return可通过help()函数查看函数说明作用域 2.不定长参数3.递归4.高阶函数将函数作为参数传递将函数作为返回值返回 5.匿名函数6.装饰器 1.对函数的理解 函数可以用来保存一些可执行的代码&#xff0c;并且可以在需要时&am…

如何给word中的拼音加声调?分享3个方法

一&#xff0c;前言 在Word文档中标注拼音声调&#xff0c;是许多人在处理中文文档时经常需要面对的问题。对于不熟悉拼音的人来说&#xff0c;这可能会是一个挑战。但是&#xff0c;通过掌握一些简单的步骤和技巧&#xff0c;我们可以轻松地在Word文档中标注拼音声调。 二&a…

wsl2 中docker安装完毕后无法正常启动

wsl2 中docker安装完毕后无法正常启动 1、背景2、目标3、环境4、原因4、操作5.1、查看配置5.2、 切换配置5.3、启动docker5.4、验证docker 1、背景 在win10中安装wsl2体验linux操作系统&#xff0c;按照docker官网步骤安装&#xff0c;安装完毕后面提示 $ docker ps Cannot co…

云计算中的过度授权:安全隐患与应对策略

云计算凭借其弹性、可扩展等优势&#xff0c;已经成为诸多企业组织拓展业务的重要基础设施之一。然而&#xff0c;与传统IT架构相比&#xff0c;云计算环境的安全管理也面临着新的挑战。过度授权 (Overprivileging) 便是云安全领域亟待解决的主要问题之一&#xff0c;本文将带领…

为什么我的 Mac 运行缓慢以及如何使用CleanMyMac X修复它

近些年伴随着苹果生态的蓬勃发展&#xff0c;越来越多的用户开始尝试接触Mac电脑。然而很多人上手Mac后会发现&#xff0c;它的使用逻辑与Windows存在很多不同&#xff0c;而且随着使用时间的增加&#xff0c;一些奇奇怪怪的文件也会占据有限的磁盘空间&#xff0c;进而影响使用…

jasypt组件死锁bug案例分享

事故描述 1、上午9.55发布了一个Apollo动态配置参数&#xff1b; 2、片刻后&#xff0c;服务器接口开始出现大量的超时告警&#xff0c;似乎是某资源被耗尽不足分配&#xff1b; 3、正值业务请求高峰的上午十点&#xff08;平台上午10点会有一些活动会拉一波用户流量&#x…

HTML表单(详解网页表单如何实现)

目录 一、表单介绍 1.概念 二、表单用法 1.HTML表单 2.HTML 表单 - 输入元素 2.1.文本域&#xff08;Text Fields&#xff09; 2.2.密码字段 2.3.单选按钮&#xff08;Radio Buttons&#xff09; 2.4.复选框&#xff08;Checkboxes&#xff09; 2.5.提交按钮(Submit)…

人人都是开发者的时代,学编程还有用吗?

欢迎大家在 GitHub 上 Star 我们&#xff1a; 分布式全链路因果学习系统 OpenASCE: https://github.com/Open-All-Scale-Causal-Engine/OpenASCE 大模型驱动的知识图谱 OpenSPG: https://github.com/OpenSPG/openspg 大规模图学习系统 OpenAGL: https://github.com/TuGraph-…

检查*.bib参考文献是否重复

安装bibtexparser pip install bibtexparser 代码 import bibtexparser from difflib import SequenceMatcherdef parse_bib_file(filename):with open(filename, r, encodingutf-8) as bibfile:bib_database bibtexparser.load(bibfile)return bib_database.entriesdef fi…

【电控笔记5.10】Luenberger估测器

Luenberger估测计 单积分器:pi控制器的补偿 双积分器:使用pid控制器的补偿 除了受控厂跟传感器,其他都在mcu 去掉Rs就是一个PLL锁相环 带宽比PLL更大