CRC循环冗余校验码介绍及检错纠错原理
知识环境:
数据校验码:通常三种:奇偶校验码;海明校验码;循环冗余校验码。
循环冗余码(CRC):
主要用于串行传送,网络,同步通信及磁表面存储等场合。即给信息码右边加上几位校验码,以增加整个编码系统的码距和查错纠错能力。
CRC编码原理:
(1)CRC又叫(N,K)码,整个编码长度:N位;
信息码长度:K位;
校验码长度:R(=N-K)位。
(2)多项式包括:信息多项式,生成多项式。
信息多项式:C(x),K-1次(又称原始报文,数据多项式);
生成多项式:G(x),R次(对应R+1位二进制数,但不是校验码);
(3)信息码与信息多项式可直接对应。如以下例1:
4位的信息码1111,对应3次的信息多项式C(x)=x^3+x^2+x^1+1.
校验码与生成多项式不可直接对应,而是利用R次G(x)对(K-1)+R次C(x)*2^R做模2除运算,以生成R位余数(即校验码)。如以下例2:
3次G(x)=x^3+x+1,对应4位除数1011;
4位原始报文1010,左移3位得1010000;
用1011对1010000进行模2除;
得余数即3位校验码:011.
最终得CRC码:1010011.
注意:模2除法与算数除法有不同。
模2除法举以下例3:
1110
-------
1011 /1100000 (1100最高位为1,商1)
1011
----
1110 (1100与1011异或)
1011 (1110最高位为1,商1)
-----
1010 (1110与1011异或)
1011 (1010最高位为1,商1)
-----
0010 (1010与1011异或)
0000 (0010最高位为0,商0)
----
010 (当余数位数小于除数,即为校验码)
K位的信息码左移R位,拼接上R位的校验码,形成完整的N位的CRC码。
(4)关于生成多项式G(x):
是接收方与发送方的约定,在整个传输过程中始终不变。
发送方利用它生成校验码,从而形成完整的CRC码,发送;接收方接收此完整的CRC编码后又利用它做模2除,检测和确定错误位置。
应满足特定的条件:a.最高位与最低位必须为1;
b.当接收方接收的CRC码字正确(与发送的CRC码一致),则用G(x)对其做模2除后,余数为0;else,即接收方接收的CRC码出错,则用生成多项式对其做模2除后,得到余数不为0,并且,不同位出错时,得到的余数不同。
c.对余数继续做模2除,应使余数循环。
已有三种生成多项式成为标准而被广泛运用,他们都具有极高的检错率:
a.CRC(12)=x^12+x^11+x^3+x^2+x^1+1
b.CRC(16)=x^16+x^15+x^2+1
c.CRC(CCITT)=x^16+x^12+x^5+1
CRC检错纠错原理:
首先可确定的是,CRC码是一种检错纠错能力很强的校验码。
当接收方检测到CRC码字出错,要求重发,即可能实现纠错。
检错:CRC码被G(x)整除,所得的余数与出错位之间有唯一的对应关系。根据这一关系便可立即确定出错位的位置。
注:若某位出错,则余数不为0.对此余数补零后继续作模2除法,又得到一个不为0的余数。
反复这样,将得到一个循环的余数队列。(所以你知道为啥叫“循环码”了吧~)
比如接着上例1,余数循环如下:011->110->111->101->001->010->100->011.
- 从零开始写项目第二篇【登陆注册、聊天、收藏夹模块】
- 关于Java你不知道的10件事
- 03-移动端开发教程-CSS3新特性(下)
- 大数据面试题整理
- 02-移动端开发教程-CSS3新特性(中)
- 强悍!Java 9 中的9个新特性
- 神经网络反向传播梯度计算数学原理
- Spring Boot 1.5.10 发布:修复重要安全漏洞!!!
- 从零开始写项目第三篇【在线聊天和个人收藏夹】
- TiDB 源码阅读系列文章(六)Select 语句概览
- 从零开始写项目第四篇【搭建Linux环境】
- salesforce零基础学习(八十六)Ajax Toolkit (VF页面中使用及javascript action使用)
- salesforce零基础学习(八十五)streaming api 简单使用(接近实时获取你需要跟踪的数据的更新消息状态)
- 深入nDPI
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- java_数据类型转换、运算符
- JavaScript中字符串运算符是什么?有哪些?
- Docker日常使用方式
- 使用Python爬取动态网页-豆瓣电影(JSON)
- Linux安装配置PHPmyadmin
- Angular Service依赖注入的一个具体例子
- php学习day1
- 在Angular里使用rxjs的异步API - Observable
- 自动化监控Oracle表空间并发送报警
- Angular里的消息(Message)显示
- Angular应用内路由(In App Route)的最佳实践
- Angular应用的路由指令RouterLink
- ctfhub-信息泄泄露_备份文件下载
- Angular In-memory Web API使用介绍
- 攻防世界-php_rce