版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 结构力学优化算法:形状优化中的材料属性
- 机械设计基础(第3版)课件 第10章 连接
- 工程测量第14章测绘在城市规划管理中的应用
- 高考生物一轮复习考点创新题训练考点14发酵工程
- 切割机粉尘岗位安全操作规程
- 《以工匠精神雕琢时代品质》课件++2024-2025学年统编版高中语文必修上册
- 黄金卷8(试卷版)
- 吞咽障碍的并发症
- 危重患儿护理
- 口腔正畸患者护理流程
- 2019版外研社高中英语必修一单词表(可默写)
- 养成良好习惯
- 提土旁、斜玉旁的写法(教学设计)2022-2023学年书法四年级 全国通用
- 频谱仪N9020A常用功能使用指南
- 中国联通高通量数据网架构及关键技术白皮书 2023
- 【高中语文大单元教学设计研究国内外文献综述6800字】
- 食管癌护理课件
- 《导游业务》电子教案
- 初中生物-第三节 安全用药教学课件设计
- 读书分享(《给教师的建议》)教学课件
- 吴冬冬:长方体和正方体的认识PPT
评论
0/150
提交评论