标准CRC生成多项式如下表:_第1页
标准CRC生成多项式如下表:_第2页
标准CRC生成多项式如下表:_第3页
标准CRC生成多项式如下表:_第4页
标准CRC生成多项式如下表:_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、标准CRC生成多项式如下表:名称CRC-4CRC-8CRC-8CRC-8CRC-12CRC-16生成多项式 x4+x+1 x8+x5+x4+1 x8+x2+x1+1x8+x6+x4+x3+x2+x1 x12+x11+x3+x+1 x16+x15+x2+1简记式*标准引用3 ITU G.7040x310x070x5E80F8005 IBM SDLCCRC16-CCITT x16+x12+x5+11021 ISO HDLC, ITU X.25, V.34/V.41/V.42,PPP-FCSCRC-32 x32+x26+x23+.+x2+x+104C11DB7 ZIP, RAR, IEEE 802

2、LAN/FDDI, IEEE1394, PPP-FCSCRC-32c x32+x28+x27+.+x8+x6+1 1EDC6F41 SCTP生成多项式的最高位固定的 1,故在简记式中忽略最高位1 了,如0x1021实际是0x11021。I、基本算法(人工笔算):以CRC16-CCITT为例进行说明,CRC校验码为16位,生成多项式17位。假如数据流为4 字节:BYTE3、BYTE2、BYTE1、BYTE0;数据流左移16位,相当于扩大256X256倍,再除以生成多项式 0x11021,做不借位的除法 运算(相当于按位异或),所得的余数就是CRC校验码。发送时的数据流为 6 字节:BYTE3、B

3、YTE2、BYTE1、BYTE0、CRC1、CRC0;II、计算机算法1 (比特型算法):1)将扩大后的数据流(6字节)高16位(BYTE3、BYTE2)放入一个长度为16的寄存 器;2)如果寄存器的首位为1,将寄存器左移1位(寄存器的最低位从下一个字节获得),再与生成多项式的简记式异或;否则仅将寄存器左移1位(寄存器的最低位从下一个字节获得);3)重复第2步,直到数据流(6字节)全部移入寄存器;4)寄存器中的值则为 CRC校验码CRC1、CRC0。III、计算机算法2 (字节型算法):256An表示256的n次方把按字节排列的数据流表示成数学多项式,设数据流为BYTE nBYTEn 1BYT

4、E n 2 、BYTE1BYTE0,表示成数学表达式为BYTEn X256An+BYTEn-1 256人(n-1)+.+BYTE1*256+BYTE0,在这里+表示为异或运算。设生成多项式为G17 ( 17bit),CRC 码为 CRC16。贝打CRC16 =(BYTEn X56An+BYTEn-1 256人(n-1)+.+BYTE1256+BYTE0) X56A2/G17,即数据流左移16位,再除以生成多项式G17。先变换BYTEn-1、BYTEn-1扩大后的形式,CRC16 =BYTEn X256An X56A2/G17+BYTEn-1 256A(n-1) 2X6A2/G17+.+BYTE

5、1 25X 乂56人2心17 +BYTE0 X256A2/G17(Zn+Yn/G17) 256人n+BYTEn-1 256人(n-1) 256A2/G17+.+BYTE125X X?56A2/G17+BYTE0 X256A2/G17Zn 256An+Yn 256/G17+BYTEn-1 256人217 256人(n-1)+.+BYTE1 256X256A2/G1 7+BYTE0 X256A2/G17Zn 256An+(YH8n256+YHLn) X256/G17+BYTEn-1 256A2/G17 256人(n-1)+.+BYTE1 256 256A2/G17+BYTE0256A2/G17Zn

6、 256An+YHLn X256/G17+(YH8n+BYTEn-1)256A2/G17 256人(n-1)+.+BYTE1256 X256A2/G17+BYTE0256人2心17这样就推导出,BYTEn-1字节的CRC校验码为YHLn X256/G17+(YH8n+BYTEn-1)256A2/G17,即上一字节 CRC 校验码 Yn的高 8位(YH8n)与本字节 BYTEn-1异或,该结果单独计算 CRC校验码(即单字节的16位CRC校验码,对单字节可建立表格, 预 先生成对应的16位CRC校验码),所得的CRC校验码与上一字节 CRC校验码Yn的低8 位(YL8n)乘以256 (即左移8位

7、)异或。然后依次逐个字节求出CRC,直到BYTEO。字节型算法的一般描述为:本字节的CRC码,等于上一字节 CRC码的低8位左移8位,与上一字节CRC右移8位同本字节异或后所得的CRC码异或。字节型算法如下:1) CRC寄存器组初始化为全O(OxOOOO)。(注意:CRC寄存器组初始化全为 1时,最后 CRC应取反。)2) CRC寄存器组向左移 8位,并保存到CRC寄存器组。3) 原CRC寄存器组高8位(右移8位)与数据字节进行异或运算,得出一个指向值表的 索引。4) 索引所指的表值与 CRC寄存器组做异或运算。5) 数据指针加1,如果数据没有全部处理完,则重复步骤2)。6) 得出CRC。un

8、 sig ned short GetCrc_16( un sig ned char * pData, int nLen gth)/函数功能:计算数据流* pData的16位CRC校验码,数据流长度为nLengthunsigned short cRc_16 = 0x0000;/ 初始化while( nLe ngth0)cRc_16 = (cRc_16 8) A *pData) & 0xff; cRctable_16表由函数mK_cRctable生成nLen gth-;pData+;return cRc_16;void mK_cRctable( un sig ned short gEn poly)

9、II函数功能:生成 0 255对应的16CRC校验码,其实就是计算机算法1 (比特型算法)gEnpoly为生成多项式注意,低位先传送时,生成多项式应反转(低位与高位互换)。如CRC16-CCITT为0x1021 ,反转后为0x8408un sig ned short cRc_16=0;un sig ned short i,j,k;for(i=0,k=0;i256;i+,k+)cRc_16 = i0;j-)if(cRc_16&0x8000)/反转时 cRc_16&0x0001cRc_16=(cRc_16=1)AgEnpolyelsecRc_16=1cRctable_16k = cRc_16;这几

10、天研究了一下CRC算法,碰到了一些问题,研究了一下,小有心得。CRC算法是在通讯领域广泛采用的校验算法。原理我就不说了,这 里说一下简单的程序实现。以下均采用CRC多项式为0x1021即:g(x) = x16+x12+x5+xO;CRC的基本原理就不说了,那个搜一下就有了。最基本的算法应该是按位计算了,这个方法可以适用于所有长度的 数据校验,最为灵活,但由于是按位计算,其效率并不是最优,只适用于对速度 不敏感的场合。基本的算法如下:un sig ned short do_crc_16( un sig ned char *message, un sig ned in t le n) 一 一int

11、 i, j;un sig ned short crc_reg = 0;un sig ned short curre nt;for (i = 0; i len; i+)curre nt = messagei 8;for (j = 0; j 8; j+)if (short)(crc_reg A curre nt) 0)crc_reg = (crc_reg 1) a 0x1021; elsecrc_reg = 1; current 8; /* 以 8 位二进制数的形式暂 存CRC勺高8位*/crc0)fcs = (fcs 8) A crc16_ccitt_table(fcs A *pData) &

12、Oxff;nLength-; pData+;return fcs;/ 取反 检验的时候,只要用以下方法就可以int IsCrc16Good(unsigned char* pData, int nLength)unsigned short fcs = Oxffff;/ 初始化while(nLengthO)fcs = (fcs 8) Acrc16_ccitt_table(fcs A *pData) &Oxff;nLength-; pData+;/ return ();/ 0xf0b8 是 CRC-ITU的Magic Valueif(fcs = 0xf0b8)return 1;elsereturn

13、-1;返回 1 则数据无误,否则数据错误。其表的生成方法也比较简单, 对于前一种查表方法, 其生成表的算法可以由按位 生成算法来计算得到,对0255的字节进行CRC校验,得到的校验值分别做为 表的相应项。对于后一种查表方法,其码表可以由以下方法计算得到,void crc16_ccitt()unsigned char index = 0;unsigned short to_xor;int i;printf(unsigned short crc16_ccitt_table256 =n);while (1)if (!(index % 8)printf(n);to_xor = index;for (i

14、 = 0; i 1) A 0x8408;elseto_xor = 1;printf(0x%04x, to_xor);if (index = 255)printf(n); break;elseprintf(, ); index+;prin tf(;); /return 0;这样,对CR(算法算是有一个新的认识了,至少是分清了对于同一个多项式, 为 什么会有不同的计算方法。弄清后,就会明白在什么场合用什么样的算法。#6 生成 crc32贴子回复于:2007-3-14 21:03:35/*生成下面的crc32 表unsignedchari,j;unsignedlongcrc,crc32_table2

15、56;for(i0;256;i+)i;crc*/forcode unsigned(jifelsecrc32_tablei0;8;j+)(crc1)crccrc(crc=1;crc;long crc32_table2561)人 0xEDB88320;OxOOOOOOOOL,0x706af48fL,0xe0d5e91eL,0x90bf1d91L,0x1adad47dL,0x646ba8c0L,0xfa0f3d63L,0xa2677172L,0x35b5a8faL,0x45df5c75L,0xc8d75180L,0xb8bda50fL,0x2f6f7c87L,0x01db7106L,0x9fbfe4

16、a5L,0xe10e9818L,0x77073096L,0xe963a535L,0x97d2d988L,0x1db71064L,0x6ddde4ebL,0xfd62f97aL,0x8d080df5L,0x3c03e4d1L,0x42b2986cL,0xdcd60dcfL,0xbfd06116L,0x2802b89eL,0x58684c11L,0x98d220bcL,0xe8b8d433L,0x7f6a0dbbL,0xee0e612cL,0x9e6495a3L,0x09b64c2bL,0x6ab020f2L,0xf4d4b551L,0x8a65c9ecL,0x3b6e20c8L,0x4b04d4

17、47L,0xdbbbc9d6L,0xabd13d59L,0x21b4f4b5L,0x5f058808L,0xc1611dabL,0xefd5102aL,0x7807c9a2L,0x086d3d2dL, 0x990951baL, 0x0edb8832L, 0x7eb17cbdL, 0xf3b97148L, 0x83d385c7L, 0x14015c4fL, 0x4c69105eL, 0xd20d85fdL, 0xacbcf940L, 0x26d930acL, 0x56b3c423L, 0xc60cd9b2L, 0xb6662d3dL, 0x71b18589L, 0x0f00f934L, 0x91

18、646c97L,0x076dc419L,0x79dcb8a4L,0xe7b82d07L,0x84be41deL,0x136c9856L,0x63066cd9L,0xd56041e4L,0xa50ab56bL,0x32d86ce3L,0x51de003aL,0xcfba9599L,0xb10be924L,0x76dc4190L,0x06b6b51fL,0x9609a88eL,0xe6635c01L, 0x1b01a57bL, 0x8bbeb8eaL, 0xfbd44c65L, 0x4adfa541L, 0x346ed9fcL, 0xaa0a4c5fL, 0xc90c2086L, 0x5edef9

19、0eL, 0x2eb40d81L, 0x03b6e20cL, 0x73dc1683L, 0xe40ecf0bL, 0x8708a3d2L, 0x196c3671L, 0x67dd4accL, 0xd6d6a3e8L, 0xa6bc5767L, 0x36034af6L, 0x4669be79L, 0xcc0c7795L, 0xb2bd0b28L, 0x2cd99e8bL, 0x026d930aL, 0x95bf4a82L, 0xe5d5be0dL, 0x68ddb3f8L, 0x18b74777L, 0x8f659effL, 0xd70dd2eeL, 0x4969474dL, 0x37d83bf

20、0L, 0xbdbdf21cL, 0xcdd70693L, 0x5d681b02L, 0x2d02ef8dL 0x8208f4c1L, 0xfcb9887cL, 0x4db26158L, 0x3dd895d7L, 0xad678846L, 0xdd0d7cc9L, 0x5768b525L, 0x29d9c998L, 0xb7bd5c3bL, 0x74b1d29aL, 0xe3630b12L, 0x9309ff9dL, 0x1e01f268L, 0x6e6b06e7L, 0xf9b9df6fL, 0xa1d1937eL, 0x3fb506ddL, 0x41047a60L, 0xcb61b38cL

21、, 0xbb0b4703L, 0x2bb45a92L, 0x5bdeae1dL, 0x9c0906a9L, 0xe2b87a14L, 0x7cdcefb7L, 0x1fda836eL, 0x88085ae6L, 0xf862ae69L, 0x4e048354L, 0x3e6e77dbL, 0xa9bcae53L, 0xcabac28aL, 0x54de5729L, 0x2a6f2b94L, 0xf50fc457L, 0x62dd1ddfL, 0x3ab551ceL, 0xa4d1c46dL, 0xda60b8d0L, 0x5005713cL, 0x206f85b3L, 0xb0d09822L,

22、 0xc0ba6cadL, 0xead54739L, 0x94643b84L, 0x0a00ae27L, 0x6906c2feL, 0xfed41b76L, 0x8ebeeff9L, 0x38d8c2c4L, 0x48b2364bL, 0xdf60efc3L, 0xbc66831aL, 0x220216b9L, 0x5cb36a04L, 0x9b64c2b0L, 0xeb0e363fL, 0x7bb12baeL, 0x0bdbdf21L, 0x81be16cdL, 0xff0f6a70L, 0x616bffd3L, 0x3903b3c2L, 0xaed16a4aL, 0xdebb9ec5L,

23、0x53b39330L, 0x23d967bfL, 0xb40bbe37L, 0x65b0d9c6L, 0x15da2d49L, 0xa3bc0074L, 0xd3d6f4fbL, 0x44042d73L, 0x270241aaL, 0xb966d409L, 0xc7d7a8b4L, 0xedb88320L, 0x9dd277afL, 0x0d6d6a3eL, 0x7d079eb1L, 0xf762575dL, 0x89d32be0L, 0x17b7be43L, 0x4fdff252L, 0xd80d2bdaL, 0xa867df55L, 0x256fd2a0L, 0x5505262fL, 0xc2d7ffa7L, 0xec63f226L, 0x72076785L, 0x0cb61b38L, 0x86d3d2d4L, 0xf6b9265bL, 0x66063bcaL, 0x166ccf45L, 0xa7672661L, 0xd9d65adcL, 0x47b2cf7fL, 0x24b4a3a6L, 0xb3667a2eL, 0xc30c8ea1L, 0x12b7e950L, 0x8cd37cf3L, 0

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论