【计算机网络】循环冗余校验:Cyclic Redundancy Check

1. 任务目标

利用循环冗余校验(CRC)检测错误。

循环冗余校验(英语:Cyclic redundancy check,通称 CRC)是一种根据网上数据包或计算机文件等数据产生简短固定位数校验码的一种散列函数,主要用来检测或校验数据传输或者保存后可能出现的错误。生成的数字在传输或者存储之前计算出来并且附加到数据后面,然后接收方进行检验确定数据是否发生变化。一般来说,循环冗余校验的值都是32位的整数。由于本函数易于用二进制的计算机硬件使用、容易进行数学分析并且尤其善于检测传输通道干扰引起的错误,因此获得广泛应用。此方法是由W. Wesley Peterson于1961年发表。

2. 需要编写的程序

crc_encoder:利用 CRC 将数据字转换为码字。

crc_decoder:在恢复数据字的同时,检测是否存在错误。

3. 详细说明(请仔细阅读并按照指示实现)

3.1. crc_encoder

(1) crc_encoder 应按以下方式运行

./crc_encoder input_file output_file generator dataword_size

要传递给程序的参数有4个,如下所示:

  • input_file:要传输的文件
  • output_file:用CRC编码的要传输的文件
  • generator:CRC的生成多项式
  • dataword_size:数据字的大小。在 crc_encoder 中,应将文件划分为数据字的大小,并将每个数据字转换为码字,单位为 bit。

如果参数数量不匹配,则输出以下消息并退出,usage:

./crc_encoder input_file output_file generator dataword_size

(2) 如果无法打开 input_file,则输出以下消息并退出:

input file open error.

(3) 如果无法打开 output_file,则输出以下消息并退出:

output file open error.

dataword_size 只支持 4 或 8。如果不是 4 或 8,则输出以下消息并退出。 

dataword size must be 4 or 8.

(5) crc_encoder 将从输入文件中读取的数据分割为 dataword 大小。

  • 举个例子,假设输入文件中只有一个字符 'A'。'A' 的 ASCII 码为 65,在二进制中表示为 01000001。因此,第一个 dataword 是 '0100',第二个 dataword 是 '0001'。

(6) 将每个 dataword 转换为 codeword。为此,执行如下的模二除法以获得余数。

  • 假设程序的参数中给定的 generator 是 '1101'。
  • 第一个 dataword 是 '0100'。
  • 由于 generator 是四位数,所以在 dataword 后面添加 '000'。
  • 使用模二除法将 '0100000' 除以 '1101'。

  • 余数为 '011',因此将其附加在 dataword 后面以生成 codeword。
  • dataword '0100' 的 codeword 是 '0100011'。
  • 其余的 dataword 也以相同的方式转换为 codeword。

(7) 使用 CRC 转换后的 codeword 必须写入输出文件。然而,一个问题是,由于 codeword 不是 8 的倍数,所以文件大小可能不会以字节为单位对齐。

  • 例如,一个由一个字符 'A' 组成的文件的内容是 8 位,但是使用 4 位的生成器将其转换为 codeword 后,总共有 14 位。由于文件是按字节写入的,因此需要将其转换为 16 位(2 字节),为此使用零填充。

填充可以放在前面或后面,这里选择放在前面。

  • 将 'A' 按照 4 位一组转换为 codeword 后得到 '01000110001101'。因此,需要添加两位填充,以使其达到 16 位,因此在前面添加两个零。结果是 '0001000110001101'。前两位不是 codeword 的位,而是填充位。

接收者需要对编码文件进行解码,为此需要知道填充位的数量。因此,将输出文件的第一个字节设置为表示填充位数量的字节。

在上述示例中,由于填充位数量为 2,因此输出文件的第一个字节为 '00000010'。

因此,一个由一个字符 'A' 组成的输入文件经过 crc_encoder 程序处理后,输出文件的内容如下。这里使用二进制表示值。

00000010 00010001 10001101 

3.2 cre_decoder

(1) crc_decoder 应按以下方式运行:

./crc_decoder input_file output_file result_file generator dataword_size 

程序的参数总共有 5 个,如下所示:

  • input_file:经过 CRC 编码的文件
  • output_file:删除 CRC 并恢复原始数据的文件
  • result_file:显示总帧数和出错帧数的文件
  • generator:CRC 的生成器
  • dataword_size:dataword 的大小,单位是 bit。

如果参数数量不匹配,则输出以下消息并退出:

usage: ./crc_decoder input_file output_file result_file generator dataword_size

(2) 如果无法打开 input_file,则输出以下消息并退出:

input file open error.

(3) 如果无法打开 output_file,则输出以下消息并退出:

output file open error.

(4) 如果无法打开 result_file,则输出以下消息并退出:

result file open error.

(5) 如果 dataword_size 不是 4 或 8,则输出以下消息并退出:

dataword size must be 4 or 8.

(6) 首先,crc_decoder 读取输入文件的第一个字节以确定填充的大小。

(7) 然后,crc_decoder 从第二个字节中移除填充。

(8) 接下来,将剩余的位数按照 codeword 的大小进行划分。

  • 例如,如果输入文件是 '00000010 00010001 10001101',则从第一个字节得知填充大小为 2 位。然后,忽略第二个字节的前两位 '00',然后将剩余位数划分为 codeword。这样就得到了两个 codeword,'0100011' 和 '0001101'。

(9) 对于每个 codeword,使用生成器进行模二除法,以确定是否存在错误。记录总的 codeword 数量和出现错误的 codeword 数量。

(10) 无论 codeword 是否存在错误,都将其恢复为 dataword 并写入输出文件。

(11) 在结果文件中记录总的 codeword 数量和出现错误的 codeword 数量。例如,如果总的 codeword 数量为 23 个,其中有 5 个出现错误,则结果文件应该写入一行,如下所示:

23 5
  • 首个填充字节和填充位不包含在总的 codeword 数量或有错误的 codeword 数量中。

3.3. linksim

linksim 是以二进制格式提供的程序,而不是作为作业要求实现的程序。

要运行 linksim,执行以下操作:

./linksim inputfile outputfile error_ratio(0-1) seed_num

input file 是经过介质传输之前的文件,而 output file 是经过介质传输后的文件。

error_ratio 表示每个比特的错误率。例如,如果 error_ratio 为 0.1,则表示每个比特出现错误的概率为 10%。error_ratio 的取值范围应为 0 到 1 之间。

seed_num 是随机数生成器的种子值。如果将其设置为相同的值,则随机数的序列相同;如果设置为不同的值,则序列不同。

3.4 运行顺序

已经完成了 crc_encoder 和 crc_decoder 的实现后,接下来可以这样测试。

假设数据存储在名为 datastream.tx 的文件中。

>> ./crc_encoder datastream.tx codedstream.tx 1101 4
>> ./linksim codedstream.tx codedstream.rx 0.0 1001
>> ./crc_decoder codedstream.rx datastream.rx result.txt 1101 4 

由于在此处将 linksim 的错误率设为 0,因此如果程序没有错误,datastream.tx 和 datastream.rx 应完全匹配。

对于 result.txt,由于没有错误,第二个数字应为 0,而第一个数字在 dataword 大小为 4 时应为初始输入文件大小的两倍,在 dataword 大小为 8 时应为初始输入文件大小。

在上述示例中,如果 datastream.tx 为 42 字节,则 result.txt 应如下所示:

84 23

表达的意思是:共发送了 84 个码字,其中 23 个被检测出错误。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

智慧文旅展现文化新风貌,科技助力旅行品质升级:借助智慧技术,文旅产业焕发新生机,为旅行者带来更高品质的文化体验之旅

一、引言 在数字化、智能化的浪潮下,文旅产业正迎来前所未有的发展机遇。智慧文旅作为文旅产业与信息技术深度融合的产物,不仅为旅行者带来了全新的文化体验,也为文旅产业注入了新的活力。本文旨在探讨智慧文旅如何借助智慧技术展现文化新风…

C++:二叉搜索树的底层模拟实现

概念: 二叉搜索树又称二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树: 搜索二叉树的操作: int a[] {8, 3, 1, 10, 6, 4, 7, 14, 13};二叉搜索树需要满足左子树比根小,右子树比根大,…

Leetcode—1235. 规划兼职工作【困难】(upper_bound、自定义排序规则)

2024每日刷题&#xff08;125&#xff09; Leetcode—1235. 规划兼职工作 算法思想 实现代码 class Solution { public:int jobScheduling(vector<int>& startTime, vector<int>& endTime, vector<int>& profit) {int n startTime.size();vec…

循环神经网络完整实现(Pytorch 13)

一 循环神经网络的从零开始实现 从头开始基于循环神经网络实现字符级语言模型。 %matplotlib inline import math import torch from torch import nn from torch.nn import functional as F from d2l import torch as d2lbatch_size, num_steps 32, 35 train_iter, vocab …

(六)SQL系列练习题(下)#CDA学习打卡

目录 三. 查询信息 16&#xff09;检索"1"课程分数小于60&#xff0c;按分数降序排列的学生信息​ 17&#xff09;*按平均成绩从高到低显示所有学生的所有课程的成绩以及平均成绩 18&#xff09;*查询各科成绩最高分、最低分和平均分 19&#xff09;*按各科成绩…

PHP 反序列化

一、PHP 序列化 1、对象的序列化 <?php class people{public $nameGaming;private $NationLiyue;protected $Birthday12/22;public function say(){echo "老板你好呀&#xff0c;我是和记厅的镖师&#xff0c;叫我嘉明就行&#xff0c;要运货吗你&#xff1f;"…

手机恢复出厂设置ip地址会变吗

当我们对手机进行恢复出厂设置时&#xff0c;很多人会担心手机的IP地址是否会发生变化。IP地址对于手机的网络连接至关重要&#xff0c;它决定了手机在网络中的身份和位置。那么&#xff0c;手机恢复出厂设置后&#xff0c;IP地址到底会不会发生变化呢&#xff1f;虎观代理小二…

Jenkins docker部署springboot项目

1、创建jenkins容器 1&#xff0c;首先&#xff0c;我们需要创建一个 Jenkins 数据卷&#xff0c;用于存储 Jenkins 的配置信息。可以通过以下命令创建一个数据卷&#xff1a; docker volume create jenkins_data启动 Jenkins 容器并挂载数据卷&#xff1a; docker run -dit…

Python量化择时的技术指标函数

Python量化择时的技术指标函数 技术指标通过对原始数据&#xff08;开盘价、收盘价、最低价、最高价、成交量、成交金额、成交笔数&#xff09;的处理&#xff0c;来反映出市场的某一方面深层的内涵&#xff0c;这些内涵是很难通过原始数据直接看出来的。技术指标能客观地反映…

EXCEL怎样把筛选后含有公式的数据,复制粘贴到同一行的其它列?

自excel2003版之后&#xff0c;常规情况下&#xff0c;复制筛选后的数据&#xff0c;会忽略隐藏行&#xff0c;仅复制其筛选后的数据&#xff0c;粘贴则是粘贴到连续单元格区域&#xff0c;不管行是在显示状态还是隐藏状态。 一、初始数据&#xff1a; 二、题主的复制粘贴问题…

Codigger数据篇(下):数据安全的全方位保障

在数字化浪潮中&#xff0c;数据已成为现代企业的核心财富。Codigger作为领先的数据服务平台&#xff0c;深知数据安全对于用户的重要性&#xff0c;因此在深挖数据价值的同时&#xff0c;我们始终坚守数据安全防线。 一、双重加密技术保障 Codigger平台运用先进的加密通信和…

C语言学习【最基本】

C语言学习 简单的 C 程序示例 #include "stdio.h" /* 提供键盘输入与屏幕输出支持 */ /* 相当于把stdio.h文件中的所有内容都输入到该行所在位置 拷贝-粘贴 *//* void 表示不带任何参数 */ int main(void) /* 函数名 */ { …

UE—动画

1.动画蓝图 创建动画蓝图 在蓝图中添加状态机 状态机中状态的转换 转换条件设定 播放的动画 使用动画资源 使用混合空间 2.混合空间 混合空间1D 阿赵UE学习笔记——26、动画混合空间_ue 一维动画混合空间-CSDN博客 蓝图创建 混合空间内 按Ctrl到动画节点上即可预览 修改…

1. 傅里叶变换原理

1. 频率域的引入 1.1 时域角度 1.2. 频域角度 不同的角度表达的是同一件事情&#xff0c;从时间域和空间域来进行表达同一间事情 。时间域是都动态的&#xff0c;频率域是静止的 1.3. 时域角度和频域角度 1.4 相位 2 函数的时域角度 2.1 时间域 2.2 频率域 2.3 例子 2.3…

Spring扩展点(一)Bean生命周期扩展点

Bean生命周期扩展点 影响多个Bean的实例化InstantiationAwareBeanPostProcessorBeanPostProcessor 影响单个Bean的实例化纯粹的生命周期回调函数InitializingBean&#xff08;BeanPostProcessor 的before和after之间调用&#xff09;DisposableBean Aware接口在生命周期实例化过…

eSIM Network搭建指南

有任何关于GSMA\IOT\eSIM\RSP\业务应用场景相关的问题&#xff0c;欢迎W: xiangcunge59 一起讨论, 共同进步 (加的时候请注明: 来自CSDN-iot).

redis 缓存一致性,缓存穿透,缓存雪崩,缓存击穿

1.缓存一致性&#xff1a; 缓存一致性就是通过各种方法保证缓存与数据库信息一种&#xff0c;其中最多的办法就是想尽一切办法对过期key进行清除&#xff0c;以保证redis和数据库信息一只&#xff0c;其中就包括了这篇文章中提到的内存淘汰策略&#xff0c;过期key的清除等等&…

MongoDB的分片集群

MongoDB分片技术 介绍 ​ 分片&#xff08;sharding&#xff09;是MongoDB用来将大型集合分割到不同服务器上采用的方法。分片这种说法起源于关系型数据库。但是实际上非关系型数据库在分片方面相比于传统的关系型数据库更有优势。 ​ 与MySQL分库方案对比&#xff0c;MongoDB…

微信小程序之搜索框样式(带源码)

一、效果图&#xff1a; 点击搜索框&#xff0c;“请输入搜索内容消失”&#xff0c;可输入关键字 二、代码&#xff1a; 2.1、WXML代码&#xff1a; <!--搜索框部分--><view class"search"><view class"search-btn">&#x1f50d;&l…

腾讯云IM即时通信引入(React Web端组件式)

开发环境要求 React ≥ v18.0 &#xff08;17.x 版本不支持&#xff09; TypeScript node&#xff08;12.13.0 ≤ node 版本 ≤ 17.0.0, 推荐使用 Node.js 官方 LTS 版本 16.17.0&#xff09; npm&#xff08;版本请与 node 版本匹配&#xff09; chat-uikit-react 集成 …