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

2024-05-05 06:36

本文主要是介绍【计算机网络】循环冗余校验: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 个被检测出错误。

这篇关于【计算机网络】循环冗余校验:Cyclic Redundancy Check的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/961016

相关文章

Python中顺序结构和循环结构示例代码

《Python中顺序结构和循环结构示例代码》:本文主要介绍Python中的条件语句和循环语句,条件语句用于根据条件执行不同的代码块,循环语句用于重复执行一段代码,文章还详细说明了range函数的使... 目录一、条件语句(1)条件语句的定义(2)条件语句的语法(a)单分支 if(b)双分支 if-else(

Python判断for循环最后一次的6种方法

《Python判断for循环最后一次的6种方法》在Python中,通常我们不会直接判断for循环是否正在执行最后一次迭代,因为Python的for循环是基于可迭代对象的,它不知道也不关心迭代的内部状态... 目录1.使用enuhttp://www.chinasem.cnmerate()和len()来判断for

Java循环创建对象内存溢出的解决方法

《Java循环创建对象内存溢出的解决方法》在Java中,如果在循环中不当地创建大量对象而不及时释放内存,很容易导致内存溢出(OutOfMemoryError),所以本文给大家介绍了Java循环创建对象... 目录问题1. 解决方案2. 示例代码2.1 原始版本(可能导致内存溢出)2.2 修改后的版本问题在

Spring常见错误之Web嵌套对象校验失效解决办法

《Spring常见错误之Web嵌套对象校验失效解决办法》:本文主要介绍Spring常见错误之Web嵌套对象校验失效解决的相关资料,通过在Phone对象上添加@Valid注解,问题得以解决,需要的朋... 目录问题复现案例解析问题修正总结  问题复现当开发一个学籍管理系统时,我们会提供了一个 API 接口去

JAVA中while循环的使用与注意事项

《JAVA中while循环的使用与注意事项》:本文主要介绍while循环在编程中的应用,包括其基本结构、语句示例、适用场景以及注意事项,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录while循环1. 什么是while循环2. while循环的语句3.while循环的适用场景以及优势4. 注意

spring 参数校验Validation示例详解

《spring参数校验Validation示例详解》Spring提供了Validation工具类来实现对客户端传来的请求参数的有效校验,本文给大家介绍spring参数校验Validation示例详... 目录前言一、Validation常见的校验注解二、Validation的简单应用三、分组校验四、自定义校

Python中的异步:async 和 await以及操作中的事件循环、回调和异常

《Python中的异步:async和await以及操作中的事件循环、回调和异常》在现代编程中,异步操作在处理I/O密集型任务时,可以显著提高程序的性能和响应速度,Python提供了asyn... 目录引言什么是异步操作?python 中的异步编程基础async 和 await 关键字asyncio 模块理论

好题——hdu2522(小数问题:求1/n的第一个循环节)

好喜欢这题,第一次做小数问题,一开始真心没思路,然后参考了网上的一些资料。 知识点***********************************无限不循环小数即无理数,不能写作两整数之比*****************************(一开始没想到,小学没学好) 此题1/n肯定是一个有限循环小数,了解这些后就能做此题了。 按照除法的机制,用一个函数表示出来就可以了,代码如下

poj3750约瑟夫环,循环队列

Description 有N个小孩围成一圈,给他们从1开始依次编号,现指定从第W个开始报数,报到第S个时,该小孩出列,然后从下一个小孩开始报数,仍是报到S个出列,如此重复下去,直到所有的小孩都出列(总人数不足S个时将循环报数),求小孩出列的顺序。 Input 第一行输入小孩的人数N(N<=64) 接下来每行输入一个小孩的名字(人名不超过15个字符) 最后一行输入W,S (W < N),用

计算机网络基础概念 交换机、路由器、网关、TBOX

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、VLAN是什么?二 、交换机三、路由器四、网关五、TBOXTelematics BOX,简称车载T-BOX,车联网系统包含四部分,主机、车载T-BOX、手机APP及后台系统。主机主要用于车内的影音娱乐,以及车辆信息显示;车载T-BOX主要用于和后台系统/手机APP通信,实现手机APP的车辆信息显示与控