这里,不讨论CRC的纠错原理以及为什么要选下面提及的生成多项式,只是针对以下的生成多项式,如何获得CRC校验码,作一个比较详细的说明。 标准CRC生成多项式如下表: 名称 生成多项式 简记式* 标准引用 CRC-4 x4+x+1 3 ITU G.704 CRC-8 x8+x5+x4+1 0×31 CRC-8 x8+x2+x1+1 0×07 CRC-8 x8+x6+x4+x3+x2+x1 0x5E CRC-12 [...]
Archive for the ‘Algorithm & Cryptology’ Category
16位CRC校验原理与算法分析
Posted in Algorithm & Cryptology on 九月 12, 2008 | Leave a Comment »
CRC算法原理及C语言源程序
Posted in Algorithm & Cryptology on 九月 12, 2008 | Leave a Comment »
对于RF通讯的通讯可靠性,有很强的检错能力的CRC. 这里列出了实际中8,16位单片机用到的CRC实用子程序. 1. 半字节16位CRC—halfBcal_crc 2.查表CRC—Bytecal_crc 3.位计算的CRC.—-bitcal_crc 4.CRC检错的程序—-IsCrc16 5.一个很不错的CRC计算程序,–CRC16 同时本文列出了调用函数和例程 const code Ploy=0×1021; #ifndef uchar typedef unsigned char uchar; #endif #ifndef uint typedef unsigned int uint; #endif static unsigned short crc; //16bit unsigned int code crc_ta[16]={ /* CRC 半字节余式表 */ 0X0000,0X1021,0X2042, 0X3063, 0X4084, 0X50A5, 0X60C6, 0X70E7, 0X8108,0X9129,0XA14A,0XB16B,0XC18C,0XD1AD,0XE1CE,0XF1EF, }; unsigned int code crc_tab[256]={ /* CRC 余式表 */ [...]
Implementing The CCITT Cyclical Redundancy Check
Posted in Algorithm & Cryptology on 九月 12, 2008 | Leave a Comment »
Bob Felice An error detection scheme that does not impose any additional transmission overhead The CCITT-CRC error detection scheme was first employed (with some minor modifications) by IBM in its SDLC data link protocol and is used today in other modern data link protocols such as HDLC, SS7, and ISDN. Like a checksum, the CCITT-CRC [...]
CRC算法与实现
Posted in Algorithm & Cryptology on 九月 12, 2008 | Leave a Comment »
摘要: 本文首先讨论了CRC的代数学算法,然后以常见的CRC-ITU为例,通过硬件电路的实现,引出了比特型算法,最后重点介绍了字节型快速查表算法,给出了相应的C语言实现。 关键词: CRC, FCS, 生成多项式, 检错重传 引言 CRC的全称为Cyclic Redundancy Check,中文名称为循环冗余校验。它是一类重要的线性分组码,编码和解码方法简单,检错和纠错能力强,在通信领域广泛地用于实现差错控制。实际上,除 数据通信外,CRC在其它很多领域也是大有用武之地的。例如我们读软盘上的文件,以及解压一个ZIP文件时,偶尔会碰到“Bad CRC”错误,由此它在数据存储方面的应用可略见一斑。 差错控制理论是在代数理论基础上建立起来的。这里我们着眼于介绍CRC的算法与实现,对原理只能捎带说明一下。若需要进一步了解线性码、分组码、循环码、纠错编码等方面的原理,可以阅读有关资料。 利用CRC进行检错的过程可简单描述为:在发送端根据要传送的k位二进制码序列,以一定的规则产生一个校验用的r位监督 码(CRC码),附在原始信息后边,构成一个新的二进制码序列数共k+r位,然后发送出去。在接收端,根据信息码和CRC码之间所遵循的规则进行检验,以 确定传送中是否出错。这个规则,在差错控制理论中称为“生成多项式”。 1 代数学的一般性算法 在代数编码理论中,将一个码组表示为一个多项式,码组中各码元当作多项式的系数。例如 1100101 表示为 1·x6+1·x5+0·x4+0·x3+1·x2+0·x+1,即 x6+x5+x2+1。 设编码前的原始信息多项式为P(x),P(x)的最高幂次加1等于k;生成多项式为G(x),G(x)的最高幂次等于r;CRC多项式为R(x);编码后的带CRC的信息多项式为T(x)。 发送方编码方法:将P(x)乘以xr(即对应的二进制码序列左移r位),再除以G(x),所得余式即为R(x)。用公式表示为 T(x)=xrP(x)+R(x) 接收方解码方法:将T(x)除以G(x),如果余数为0,则说明传输中无错误发生,否则说明传输有误。 举例来说,设信息码为1100,生成多项式为1011,即P(x)=x3+x2,G(x)=x3+x+1,计算CRC的过程为 xrP(x) x3(x3+x2) x6+x5 x ——– = ———- = ——– = (x3+x2+x) + ——– G(x) x3+x+1 x3+x+1 x3+x+1 即 R(x)=x。注意到G(x)最高幂次r=3,得出CRC为010。 如果用竖式除法,计算过程为 1110 ——- 1011 /1100000 (1100左移3位) 1011 [...]
CCITT CRC-16计算原理与实现
Posted in Algorithm & Cryptology on 九月 10, 2008 | Leave a Comment »
CRC的全称为Cyclic Redundancy Check,中文名称为循环冗余校验。它是一类重要的线性分组码,编码和解码方法简单,检错和纠错能力强,在通信领域广泛地用于实现差错控制。实际上,除 数据通信外,CRC在其它很多领域也是大有用武之地的。例如我们读软盘上的文件,以及解压一个ZIP文件时,偶尔会碰到“Bad CRC”错误,由此它在数据存储方面的应用可略见一斑。 差错控制理论是在代数理论基础上建立起来的。这里我们着眼于介绍CRC的算法与实现,对原理只能捎带说明一下。若需要进一步了解线性码、分组码、循环码、纠错编码等方面的原理,可以阅读有关资料。 利用CRC进行检错的过程可简单描述为:在发送端根据要传送的k位二进制码序列,以一定的规则产生一个校验用的r位监督 码(CRC码),附在原始信息后边,构成一个新的二进制码序列数共k+r位,然后发送出去。在接收端,根据信息码和CRC码之间所遵循的规则进行检验,以 确定传送中是否出错。这个规则,在差错控制理论中称为“生成多项式”。 1 代数学的一般性算法 在代数编码理论中,将一个码组表示为一个多项式,码组中各码元当作多项式的系数。例如 1100101 表示为 1·x6+1·x5+0·x4+0·x3+1·x2+0·x+1,即 x6+x5+x2+1。 设编码前的原始信息多项式为P(x),P(x)的最高幂次加1等于k;生成多项式为G(x),G(x)的最高幂次等于r;CRC多项式为R(x);编码后的带CRC的信息多项式为T(x)。 发送方编码方法:将P(x)乘以xr(即对应的二进制码序列左移r位),再除以G(x),所得余式即为R(x)。用公式表示为 T(x)=xrP(x)+R(x) 接收方解码方法:将T(x)除以G(x),如果余数为0,则说明传输中无错误发生,否则说明传输有误。 举例来说,设信息码为1100,生成多项式为1011,即P(x)=x3+x2,G(x)=x3+x+1,计算CRC的过程为 xrP(x) x3(x3+x2) x6+x5 x ——– = ———- = ——– = (x3+x2+x) + ——– G(x) x3+x+1 x3+x+1 x3+x+1 即 R(x)=x。注意到G(x)最高幂次r=3,得出CRC为010。 如果用竖式除法,计算过程为 1110 ——- 1011 /1100000 (1100左移3位) 1011 —- 1110 1011 —– 1010 1011 —– 0010 [...]