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

news2024/11/19 20:32:26

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 个被检测出错误。

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

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

相关文章

消息队列与信号量(基本概念及操作接口介绍)

一、消息队列 基本概念 System V消息队列是Unix系统中一种进程间通信(IPC)机制,它允许进程互相发送和接收数据块(消息) 操作系统可以在内部申请一个消息队列,可以让不同的进程向消息队列中发送数据块&…

Java中使用RediSearch进行高效数据检索

RediSearch是一款构建在Redis上的搜索引擎,它为Redis数据库提供了全文搜索、排序、过滤和聚合等高级查询功能。通过RediSearch,开发者能够在Redis中实现复杂的数据搜索需求,而无需依赖外部搜索引擎。本文将介绍如何在Java应用中集成并使用Red…

2024抖音直播带货-直播间拆解:抖店运营从入门到精通(56节课)

起号原理方式以及节点处理 类目的选择选品思路 付费流量投放原理 直播间进阶玩法 课程内容 直播间搭建标准自然起号(0-1)原理 方式 以及节点处理 老号重启(0-1)原理 方式 以及节点处理 账号在线人数稳定 原理 方式 以及节点处理 账号销售额放大 原理 方式 以及节点处理…

【Linux】namespace 隔离、cgroup 控制

文章目录 五、namespace 隔离dd -- 读取、转换并输出数据mkfs -- 格式化文件系统df -- 显示文件系统磁盘使用情况mount -- 加载文件系统到指定的加载点unshare -- 创建子进程,同时与父程序不共享namespace一个 demo 六、cgroup(Control Group) 相关命令pidstat -- 监…

Stable Diffusion AI绘画

我们今天来了解一下最近很火的SD模型 ✨在人工智能领域,生成模型一直是研究的热点之一。随着深度学习技术的飞速发展,一种名为Stable Diffusion的新型生成模型引起了广泛关注。Stable Diffusion是一种基于概率的生成模型,它可以学习数据的潜…

nginx变量自定义日志收集

内置变量 $remote_addr;存放了客户端的地址,注意是客户端的公网IP,也就是一家人访问一个网站,则会显示为路由器的公网IP。 $args;变量中存放了URL中的指令 [rootlocalhost conf.d]# cat pc.conf server {listen 80;se…

二.Django项目之电商购物商城 -- 校验用户输入密码是否合法

Django项目之电商购物商城 – 校验用户输入密码是否合法 需要开发文档和前端资料的可私聊 一. 创建用户逻辑操作 1. 创建用户app – users python manage.py startapp users2.注册app users.apps.UsersConfig,3. 创建视图 from django.shortcuts import render from djan…

mysql 指定根目录 迁移根目录

mysql 指定根目录 迁移根目录 1、问题描述2、问题分析3、解决方法3.1、初始化mysql前就手动指定mysql根目录为一个大的分区(支持动态扩容),事前就根本上解决mysql根目录空间不够问题3.1.0、方法思路3.1.1、卸载mariadb3.1.2、下载Mysql安装包3.1.3、安装Mysql 8.353…

华为机考入门python3--(22)牛客22- 汽水瓶

分类:数字 知识点: 整除符号// 5//3 1 取余符号% 5%3 2 题目来自【牛客】 import sysdef calc_soda_bottles(n):if n 0: # 结束输入,不进行处理returnelse:# 循环进行汽水换算total_drunk 0 # 记录总共喝了多少瓶汽水while…

手把手教你安装 Garnet

什么是 Garnet Garnet 是微软使用 C# 编写的 Redis 客户端兼容缓存组件,你可以使用 Redis 客户端的连接方式来连接 Garnet 但是 Garnet 需要 .NET8 运行环境才可以使用,为了便捷性,可以考虑构建成 Docker 镜像 裸机部署 首先,…

初始数据类型

注释补充 在我们编写任何代码的时候,都有一个叫做注释的功能 在golang中有两种 单行注释 // 如下图所示 加入了注释的话,代码在执行的时候会自动忽视这段内容 //fmt.Println("天上") //fmt.Println("天下") //fmt.Println("唯…

Web端重叠路径可视化

近几年来,由于信息技术的发展,大数据成为了这个时代的代名词之一,“数据可视化”风靡一时。得益于HTML5提供的新标签“canvas”,Web端也能分“数据可视化”一杯羹。 随着越来越多的可视化方案和需求,需要解决问题也越来…

Java中接口的默认方法

为什么要使用默认方法 当我们把一个程序的接口写完后 用其他的类去实现,此时如果程序需要再添加一个抽象方法的时候我们只有两种选择 将抽象方法写在原本的接口中 但是这样写会导致其他所有改接口的实现类都需要实现这个抽象方法比较麻烦 写另一个接口 让需要的实…

Sqli-labs第一关到第四关

目录 一,了解PHP源代码 二,破解第一关 2.1在了解完源码之后,我们重点看一下 2.2破解这道题表中有几列 2.3查看表中哪一列有回显 2.4查询库,表,列信息 三,总结 前提: 之所以把1234关…

2024年5月5日 十二生肖 今日运势

小运播报:2024年5月5日,星期日,农历三月廿七 (甲辰年己巳月己巳日),法定节假日。 红榜生肖:牛、猴、鸡 需要注意:鼠、虎、猪 喜神方位:东北方 财神方位:正…

eSIM IoT vs M2M vs Consumer

有任何关于GSMA\IOT\eSIM\RSP\业务应用场景相关的问题,欢迎W: xiangcunge59 一起讨论, 共同进步 (加的时候请注明: 来自CSDN-iot). 截至2023年5月,全球移动通信系统协会(GSMA)发布了三个关键的eSIM技术规范,这些规…

2000-2020年县域创业活跃度数据

2000-2020年县域创业活跃度数据 1、时间:2000-2020年 2、指标:地区名称、年份、行政区划代码、经度、纬度、所属城市、所属省份、年末总人口万人、户籍人口数万人、当年企业注册数目、县域创业活跃度1、县域创业活跃度2、县域创业活跃3 3、来源&#…

【前端项目——分页器】手写分页器实现(JS / React)

组件介绍 用了两种方式实现,注释详细~ 可能代码写的不够简洁,见谅🙁 1. 包含内容显示的分页器 网上看了很多实现,很多只有分页器部分,没和内容显示联动。 因此我增加了模拟content的显示,这里模拟了32条数…

JavaEE初阶Day 15:文件IO(1)

目录 Day 15:文件IO(1)IO文件1. 路径2. 文件的分类3. 使用Java针对文件系统进行操作3.1 属性3.2 构造方法3.3 方法 Day 15:文件IO(1) IO I:Input输入 O:Output输出 输入输出规则…

使用机器学习确定文本的编程语言

导入必要的库 norman Python 语句&#xff1a;import <span style"color:#000000"><span style"background-color:#fbedbb"><span style"color:#0000ff">import</span> pandas <span style"color:#0000ff&quo…