当前位置: 首页 > news >正文

【CRC算法】CRC算法、原理及程序_liangchaoxi的IT博客_新浪博客

 

 

CRC算法及原理

http://www.cnblogs.com/FPGA_DSP/archive/2010/05/08/1730529.html?login=1

CRC算法及原理

CRC校验码的基本思想是利用线性编码理论, 在发送端根据要传送的k位二进制码序列,以一定的规则产生一个校验用的监督码(既CRC码)r位,并附在信息后边,构成一个新的二进制码序列数共(k+r)位,最后发送出去。在接收端,则根据信息码和CRC码之间所遵循的规则进行检验,以确定传送中是否出错。 在数据存储和数据通讯领域,CRC无处不在:著名的通讯协议X.25的FCS(帧检错序列)采用的是CRC. CCITT,ARJ、LHA等压缩工具软件采用的是CRC32,磁盘驱动器的读写采用了CRC16,通用的图像存储格式GIF、TIFF等也都用CRC作为检错手段。
    CRC的本质是模-2除法的余数,采用的除数不同,CRC的类型也就不一样。通常,CRC的除数用生成多项式来表示。最常用的CRC码的生成多项式有CRC16,CRC32. 以CRC16为例,16位的CRC码产生的规则是先将要发送的二进制序列数左移16位(既乘以2^16)后,再除以一个多项式,最后所得到的余数既是CRC码,如下式所示,其中K(X)表示n位的二进制序列数,G(X)为多项式,Q(X)为整数,R(X)是余数(既CRC码)。
K(X)>>16=G(x)Q(x)+R(x) 求CRC码所采用模2加减运算法则,既是不带进位和借位的按位加减,这种加减运算实际上就是逻辑上的异或运算,加法和减法等价,乘法和除法运算与普通代数式的乘除法运算是一样,符合同样的规律。生成CRC码的多项式如下,其中CRC-16和CRC-CCITT产生16位的CRC码,而CRC-32则产生的是32位的CRC码 接收方将接收到的二进制序列数(包括信息码和CRC码)除以多项式,如果余数为0,则说明传输中无错误发生,否则说明传输有误,关于其原理这里不再多述。用软件计算CRC码时,接收方可以将接收到的信息码求CRC码,比较结果和接收到的CRC码是否相同。 CCITT推荐的高级数据链路控制规程HDLC的帧校验序列FCS中,使用CCITT-16即CRC16,其生成多项式为G(x)=x16+x12+x5+1, CRC-32的生成多项式为G(x)=x32+x26+x23+x22+x16+x11+x10+x16+x8+x7+x5+x4+x2+x+1CRC算法原理及C语言实现

CRC原理介绍:

 CRC的英文全称为Cyclic Redundancy Check(Code),中文名称为循环冗余校验(码)。它是一类重要的线性分组码,编码和解码方法简单,检错和纠错能力强,在通信领域广泛地用于实现差错控制。 

     CRC计算与普通的除法计算有所不同。普通的除法计算是借位相减的,而CRC计算则是异或运算。任何一个除法运算都需要选取一个除数,在CRC运算中我们称之为poly,而宽度W就是poly最高位的位置。比如poly 1001的W是3,而不是4。注意最高位总是1,当你选定一个宽度,那么你只需要选择低W各位的值。假如我们想计算一个位串的CRC码,并要保证每一位都要被处理,因此我们需要在目标位串后面加上W个0。下面举例说明CRC算法的过程。     在此例中,我们假设位串为110101101。Poly                     = 10011(宽度W = 4)Bitstring + W zeros = 110101101 0000

10011/1101011010000/110000101 (我们不关心此运算的商)      10011||||||||        -----||||||||        10011|||||||        10011|||||||         -----|||||||          00001||||||          00000||||||           -----||||||            00010|||||            00000|||||             -----|||||              00101||||              00000||||               -----||||                01010|||                00000|||                  -----|||                  10100||                  10011||                   -----||                    01110|                    00000|                     -----|                     11100                     10011                      -----                       1111 -> 余数 -> CRC!

计算过程总结如下:1. 只有当位串的最高位为1,我们才将它与poly做XOR运算,否则我们只是将位串左移一位。2. 异或运算的结果实质上是被操作位串与poly的低W位进行运算的结果,因为最高位总为0。 

相关文章:

  • 【CRC算法】CRC算法、原理及程序
  • n%2==1什么意思?n/2什么意思?有n\2这种写法吗?_liangchaoxi的IT博客_新浪博客
  • n%2==1什么意思?n/2什么意思?有n\2这种写法吗?
  • 【运算符】C语言的运算符_liangchaoxi的IT博客_新浪博客
  • 【运算符】C语言的运算符
  • 头文件中应该放些什么2
  • 【printf】sprintf字符串转数值、数值转字符,拼接字符,函数详细解释 Printf 打印数值...
  • 【IAR警告】Warning[Pa082]: undefined behavior: the order of volatile accesses is undefined......
  • char   a[100]={0};初始化的含义是什么呢?_liangchaoxi的IT博客_新浪博客
  • char   a[100]={0};初始化的含义是什么呢?
  • 【乱码】输出乱码,乱码“烫烫烫……”分析_liangchaoxi的IT博客_新浪博客
  • 【乱码】输出乱码,乱码“烫烫烫……”分析
  • 字符串数组及其初始化问题_liangchaoxi的IT博客_新浪博客
  • 字符串数组及其初始化问题
  • 【链表操作】链表的建立、删除、修改、插入_liangchaoxi的IT博客_新浪博客
  • #Java异常处理
  • Docker: 容器互访的三种方式
  • egg(89)--egg之redis的发布和订阅
  • ES2017异步函数现已正式可用
  • ES6--对象的扩展
  • iOS编译提示和导航提示
  • js写一个简单的选项卡
  • Netty 框架总结「ChannelHandler 及 EventLoop」
  • Solarized Scheme
  • Vim Clutch | 面向脚踏板编程……
  • 订阅Forge Viewer所有的事件
  • 来,膜拜下android roadmap,强大的执行力
  • 容器化应用: 在阿里云搭建多节点 Openshift 集群
  • 入门到放弃node系列之Hello Word篇
  • C# - 为值类型重定义相等性
  • MyCAT水平分库
  • ​flutter 代码混淆
  • ###项目技术发展史
  • #{}和${}的区别是什么 -- java面试
  • #ifdef 的技巧用法
  • #includecmath
  • #QT(TCP网络编程-服务端)
  • %3cscript放入php,跟bWAPP学WEB安全(PHP代码)--XSS跨站脚本攻击
  • (生成器)yield与(迭代器)generator
  • (四)JPA - JQPL 实现增删改查
  • (原創) 如何使用ISO C++讀寫BMP圖檔? (C/C++) (Image Processing)
  • (转)ObjectiveC 深浅拷贝学习
  • (转载)Linux 多线程条件变量同步
  • (轉貼) 蒼井そら挑戰筋肉擂台 (Misc)
  • .FileZilla的使用和主动模式被动模式介绍
  • .Net - 类的介绍
  • .net 受管制代码
  • .NET/C# 利用 Walterlv.WeakEvents 高性能地中转一个自定义的弱事件(可让任意 CLR 事件成为弱事件)
  • .net反混淆脱壳工具de4dot的使用
  • .net下简单快捷的数值高低位切换
  • .php文件都打不开,打不开php文件怎么办
  • @Pointcut 使用
  • [2013AAA]On a fractional nonlinear hyperbolic equation arising from relative theory
  • [22]. 括号生成
  • [Asp.net MVC]Asp.net MVC5系列——Razor语法