首页 C语言获取文件CRC32算法附加CRC原理

C语言获取文件CRC32算法附加CRC原理

举报
开通vip

C语言获取文件CRC32算法附加CRC原理C语言获取文件CRC32算法附加CRC原理 搞弄了半天,终于把CRC的原理大致明白了,其实质 上就是先确定一个多项式作为CRC标准,然后将二进制序 列左移对应的位数再除以这个多项式,最后得到的余数就是CRC码。下面是网上找到的CRC原理,不弄长的了,凑合看吧。 CRC 校验的基本思想是利用线性编码理论,在发送端根据 要传送的k位二进制码序列,以一定的规则产生一个校验用的监督码(既CRC 码)r 位,并附在信息后边,构成一个新的二进制码序列数共(k+r)位,最后发送出去。在接收端,则根据信息码和CRC码之...

C语言获取文件CRC32算法附加CRC原理
C语言获取文件CRC32算法附加CRC原理 搞弄了半天,终于把CRC的原理大致明白了,其实质 上就是先确定一个多项式作为CRC标准,然后将二进制序 列左移对应的位数再除以这个多项式,最后得到的余数就是CRC码。下面是网上找到的CRC原理,不弄长的了,凑合看吧。 CRC 校验的基本思想是利用线性编码理论,在发送端根据 要传送的k位二进制码序列,以一定的 规则 编码规则下载淘宝规则下载天猫规则下载麻将竞赛规则pdf麻将竞赛规则pdf 产生一个校验用的监督码(既CRC 码)r 位,并附在信息后边,构成一个新的二进制码序列数共(k+r)位,最后发送出去。在接收端,则根据信息码和CRC码之间所遵循的规则进行检验,以确 定传送中是否出错。 16 位的CRC 码产生的规则是先将要发送的二进制序列数 左移16 位(既乘以2的16次方)后,再除以一个多项式,最后所得到的余数既是CRC 码。 求CRC码所采用的模2加减运算法则,即是不带进位和借 位的按位加减,这种加减运算实际上就是逻辑上的异或运算,加法和减法等价,乘法和除法运算与普通代数式的乘除法运算是一样,符合同样的规律。 生成CRC码的多项式如下,其中CRC-16 和CRC-CCITT 产生16 位的CRC码,而CRC-32 则产生的是32 位的CRC 码,不同的标准计算出来的CRC值不同。 CRC-16:(美国二进制同步系统中采用)G(X ) = X16 + X15 + X2 +1 CRC-CCITT:(由欧洲CCITT 推荐)G(X ) = X16 + X12 + X5 +1 CRC-32:G(X ) = X32 + X26 + X23 + X22 + X16 + X12 + X11 + X10 + X8+ X7 + X5 + X4 + X2 + X1 +1 接收方将接收到的二进制序列数(包括信息码和CRC 码)除以多项式,如果余数为0,则说明传输中无错误发生,否则说明传输有误,关于其原理这里不再多述。用软件计算CRC 码时,接收方可以将接收到的信息码求CRC 码,比较结果和接收到的CRC 码是否相同。注意发送方和接受方的CRC标准要保持一致,选择什么标准依实际情况而定。下面是经常用到的获取文件CRC32值的算法,与WINRAR 中的CRC值一致,非常实用啊,值得收藏。 #include #include #define Poly 0xEDB88320L //CRC32标准 static uint32_t crc_tab32[256]; //CRC查询 关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf static void init_crc32_tab(void); //生成CRC查询表uint32_t get_crc32(uint32_t crcinit, uint8_t * bs, uint32_t bssize); //获得CRC uint32_t GetFileCRC(FILE *fd); //获得文件CRC static void init_crc32_tab( void ) { int i, j; uint32_t crc; for (i=0; i<256; i++) { crc = (unsigned long)i; for (j=0; j<8; j++) { if ( crc & 0x00000001L ) crc = ( crc >> 1 ) ^ Poly; else crc = crc >> 1; } crc_tab32[i] = crc; } } uint32_t get_crc32(uint32_t crcinit, uint8_t * bs, uint32_t bssize) { uint32_t crc = crcinit^0xffffffff; init_crc32_tab(); while(bssize--) crc=(crc >> 8)^crc_tab32[(crc & 0xff) ^ *bs++]; return crc ^ 0xffffffff; } uint32_t GetFileCRC(FILE *fd) { uint32_t size = 16 * 1024; uint8_t crcbuf[size]; uint32_t rdlen; uint32_t crc = 0; //CRC初始值为0 while((rdlen = fread(crcbuf, sizeof(uint8_t), size, fd)) > 0) crc = get_crc32(crc, crcbuf, rdlen); return crc; } int main(int argc,char **argv) { FILE *fd; unsigned int value=0; if(argc<2) { printf("Usage: %s file",basename(argv[0])); exit(1); } if((fd=fopen(argv[1],"r"))==NULL) { perror("Error:"); exit(1); } value = GetFileCRC(fd); printf("CRC: %X\n",value); fclose(fd); return 0; }
本文档为【C语言获取文件CRC32算法附加CRC原理】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_998870
暂无简介~
格式:doc
大小:18KB
软件:Word
页数:6
分类:
上传时间:2019-05-26
浏览量:43