1 / 14
文档名称:

CRC终于搞成了.doc

格式:doc   大小:23KB   页数:14页
下载后只包含 1 个 DOC 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

CRC终于搞成了.doc

上传人:wz_198614 2017/6/17 文件大小:23 KB

下载得到文件列表

CRC终于搞成了.doc

文档介绍

文档介绍:CRC 终于搞成了今晚看了好久 CRC ,最后还有没有很明白。但是做为一个做工程的, 有结果就好了。我要用的不是标准的 CRC 公式,是 X8+1 这个,呵呵。下面开始总结。 CRC 用到的主要是模 2 除法,开始看得一头雾水,只有把这个弄清楚了,后来才有了思路。才知道 CRC 的计算过程。(此处是重点,我费了很多劲儿理解,省去若干字。)不知道计算过程,程序是绝对不能看懂的。还有这么一句话: 多项式的 MSB 略去不记, 因其只对商有影响而不影响余数。就是说对于 ITT=X16+X12+X5+1 ,可以只用 0x1021 , bit1 6 位的 1 不要了,只留下 bit12 、5、0。(参考一篇 modbus 的说明) 记住这两点,再参考下面一段话: 生成 CRC-16 校验字节的步骤如下: ①装如一个 16 位寄存器,所有数位均为 1。②该 16 位寄存器的高位字节与开始 8 位字节进行“异或”运算。运算结果放入这个 16 位寄存器。③把这个 16 寄存器向右移一位。④若向右( 标记位) 移出的数位是 1, 则生成多项式 101000000000000 1 和这个寄存器进行“异或”运算;若向右移出的数位是 0 ,则返回③。⑤重复③和④,直至移出 8 位。⑥另外 8 位与该十六位寄存器进行“异或”运算。⑦重复③~⑥,直至该报文所有字节均与 16 位寄存器进行“异或”运算,并移位 8 次。⑧这个 16 位寄存器的内容即 2 字节 CRC 错误校验,被加到报文的最高有效位。别的都是弯路, 以上是最清楚的、实惠的解释了。本文最后, 附上另一位网游的文章,也给我很大启发。下面是成功的程序: unsigned short crc(unsigned char *addr, int num) { int i; while (num--) { crc8 ^= *addr++; for (i= 0;i < 8; i++) { if (crc8 & 128) { crc8 <<= 1; crc8 ^= 0x01; //1010 0000 0000 0001b } else { crc8 <<= 1; } }} return crc8; } 另外这样也行: unsigned short crc(unsigned char *addr, int num) { //unsigned short crc8 = 0xFF; int i; while (num--) { crc8 ^= *addr++; for (i= 0;i < 8; i++) { if (crc8 & 1) { crc8 >>= 1; crc8 ^= 0x80; //1010 0000 0000 0001b } else { crc8 >>= 1; }} } return crc8; } 可能是因为我的 x8+1 只有一位的原因吧, 或者什么其他的原因, 我已经不愿意思考下去了。好累。注意: 其中两个关键的地方就是移位 1. 操作不同; 2. 生成多项式对应的字节值不同。调整这两个变量,我想,能实现不同生成多项式的 CRC 算法。另外还有查表的方式,希望以后再用到,我可以很快的搞懂。转: CRC 校验源码分析这两天做项目, 需要用到 CRC 校验。以前没搞过这东东, 以为挺简单的。结果看看别人提供的汇编源程序,居然看不懂。花了两天时间研究了一下 CRC 校验,希望我写的这点东西能够帮助和我有同样困惑的朋友节省点时间。先是在网上下了一堆乱七八遭的资料下来, 感觉都是一个模样, 全都是从 CRC 的数学原理开始,一长串的表达式看的我头晕。第一次接触还真难以理解。这些东西不想在这里讲, 随便找一下都是一大把。我想根据源代码来分析会比较好懂一些。费了老大功夫, 才搞清楚 CRC 根据”权”( 即多项表达式) 的不同而相应的源代码也有稍许不同。以下是各种常用的权。 CRC8=X8+X5+X4+1 ITT=X16+X12+X5+1 CRC16=X16+X15+X5+1 CRC12=X12+X11+X3+X2+1 CRC32=X32+X26+X23+X22+X16+X12+X11+X10+X8+X7+X5+X4+X2+X1+1 ITT 为例。其实本质都是一样,搞明白一种, 其他的都是小菜。图1,图2 说明了 CRC 校验中 CRC 值是如何计算出来的,体现的多项式正是 X16+X12+X5+1 。 Serial Data 即是需要校验的数据。从把数据移位开始计算,将数据位(从最低的数据位开始)逐位移入反向耦合移位寄存器( 这个名词我也不懂,觉得蛮酷的,就这样写了,嘿) 。当所有数据位都这样操作后,计算结束。此时, 16 位移