搜索
bottom↓
回复: 9

CRC(PEC)通用网上验算器(点击直接在网上运行)

[复制链接]

出0入0汤圆

发表于 2006-7-31 16:38:14 | 显示全部楼层 |阅读模式
CRC网上验算器(点击直接在网上运行)



smbus之PEC网上验算器网址







现在用CRC(PEC)通用网上验算器计算:

1.设置左移8位CRC.

2.权取0x03---PEC=X8+X2+X1+1







可以从下图中看出两个结果完全一样.









再举个PEC的示例:





出0入0汤圆

 楼主| 发表于 2006-8-20 23:47:41 | 显示全部楼层
晕倒~~~现在ouravr也不让运行html文件了~~~



三角密码校验JavaScript语言源程序(自考版)



三角密码校验JavaScript语言源程序

出0入0汤圆

发表于 2006-8-24 13:33:49 | 显示全部楼层
菜农果然多才多艺!!!

出0入0汤圆

 楼主| 发表于 2006-9-1 21:46:07 | 显示全部楼层
倒塌了~~~玩玩~~~想考考中学数学老师~~~

出0入0汤圆

 楼主| 发表于 2006-11-25 00:29:34 | 显示全部楼层
再加个例子~~~



CRC(PEC)通用网上验算器源码下载







下面用菜农的算法得到同样的答案~~~

出0入0汤圆

发表于 2006-12-18 15:52:51 | 显示全部楼层
菜农老大:

小弟对CRC不懂,校验一直都是最简单的奇偶校验甚至无校验。所以一直不会CRC。也不知道该如何算CRC。

看到仁兄写的这个通用计算器,小弟还是不明白。C(x)=X8+X4+X+1是八位循环冗余检验,那么是否16位就是C(x)=X16+X8+X+1了?

还有就是在16进制多项式除法中为何要除以11021(是怎么来的呢)?

什么情况下用8位,什么时候用16位CRC,是否还有其他位数的CRC?

问题比较RZ,原理性的东西不明白,还望老大百忙之中予以指教。

小弟恭祝仁兄工作顺利,万事如意!!

出0入0汤圆

发表于 2006-12-27 12:35:51 | 显示全部楼层
把酷帖顶起!把酷帖顶齐!

出0入0汤圆

发表于 2007-5-17 15:03:44 | 显示全部楼层
CRC-16    = X16 + X12 + X5 + X0 = 2^0+2^5+2^12+2^16=0x11021

CRC 的计算原理如下(一个字节的简单例子)

    11011000 00000000 00000000  <- 一个字节数据, 左移 16b

   ^10001000 00010000 1         <- CRC-CCITT 多项式, 17b

    --------------------------

     1010000 00010000 10        <- 中间余数

    ^1000100 00001000 01

     -------------------------

       10100 00011000 1100

      ^10001 00000010 0001

       -----------------------

         101 00011010 110100

        ^100 01000000 100001

         ---------------------

           1 01011010 01010100

          ^1 00010000 00100001

           -------------------

             01001010 01110101  <- 16b CRC



仿此,可推出两个字节数据计算如下:d 为数据,p 为项式,a 为余数

    dddddddd dddddddd 00000000 00000000 <- 数据 D ( D1, D0, 0, 0 )

   ^pppppppp pppppppp p                 <- 多项式 P

    -----------------------------------

    ...

             aaaaaaaa aaaaaaaa 0        <- 第一次的余数 A' ( A'1, A'0 )

            ^pppppppp pppppppp p

             --------------------------

             ...

                      aaaaaaaa aaaaaaaa <- 结果 A ( A1, A0 )



由此与一字节的情况比较,将两个字节分开计算如下:

先算高字节:

    dddddddd 00000000 00000000 00000000 <- D1, 0, 0, 0

   ^pppppppp pppppppp p                 <- P

    -----------------------------------

    ...

             aaaaaaaa aaaaaaaa          <- 高字节部分余数 PHA1, PHA0



此处的部分余数与前面两字节算法中的第一次余数有如下关系,即 A'1 = PHA1 ^ D0, A'0 = PHA0:

             aaaaaaaa aaaaaaaa          <- PHA1, PHA0

            ^dddddddd                   <- D0

             -----------------

             aaaaaaaa aaaaaaaa          <- A'1, A'0



低字节的计算:

             aaaaaaaa 00000000 00000000 <- A'1, 0, 0

            ^pppppppp pppppppp p        <- P

             --------------------------

             ...

                      aaaaaaaa aaaaaaaa <- 低字节部分余数 PLA1, PLA0

                     ^aaaaaaaa          <- A'0 , 即 PHA0

                      -----------------

                      aaaaaaaa aaaaaaaa <- 最后的 CRC ( A1, A0 )



总结以上内容可得规律如下:

设部分余数函数

    PA = f( d )

其中 d 为一个字节的数据(注意,除非 n = 0 ,否则就不是原始数据,见下文)

第 n 次的部分余数

    PA( n ) = ( PA( n - 1 ) << 8 ) ^ f( d )

其中的

    d = ( PA( n - 1 ) >> 8 ) ^ D( n )

其中的 D( n ) 才是一个字节的原始数据。



公式如下:

    PA( n ) = ( PA( n - 1 ) << 8 ) ^ f( ( PA( n - 1 ) >> 8 ) ^ D( n ) )



可以注意到函数 f( d ) 的参数 d 为一个字节,对一个确定的多项式 P, f( d ) 的返回值

是与 d 一一对应的,总数为 256 项,将这些数据预先算出保存在表里,f( d )就转换为一

个查表的过程,速度也就可以大幅提高,这也就是查表法计算 CRC 的原理。



再来看 CRC 表是如何计算出来的,即函数 f( d ) 的实现方法。分析前面一个字节数据的

计算过程可发现,d 对结果的影响只表现为对 P 的移位异或,看计算过程中的三个 8 位

的列中只有低两个字节的最后结果是余数,而数据所在的高 8 位列最后都被消去了,因其

中的运算均为异或,不产生进位或借位,故每一位数据只影响本列的结果,即 d 并不直接

影响结果。再将前例变化一下重列如下:

    11011000

    --------------------------

    10001000 00010000 1        // P

   ^ 1000100 00001000 01       // P

   ^  000000 00000000 000      // 0

   ^   10001 00000010 0001     // P

   ^    0000 00000000 00000    // 0

   ^     100 01000000 100001   // P

   ^      00 00000000 0000000  // 0

   ^       1 00010000 00100001 // P

           -------------------

             01001010 01110101



现在的问题就是如何根据 d 来对 P 移位异或了,从上面的例子看,也可以理解为每步

移位,但根据 d 决定中间余数是否与 P 异或。从前面原来的例子可以看出,决定的条

件是中间余数的最高位为0,因为 P 的最高位一定为1,即当中间余数与 d 相应位异或

的最高位为1时,中间余数移位就要和 P 异或,否则只需移位即可。其方法如下例(上例的变形,注意其中空格的移动表现了 d 的影响如何被排除在结果之外):



    d --------a--------

    1 00000000 00000000 <- HSB = 1

      0000000 000000000 <- a <<= 1

      0001000 000100001 <-不含最高位的 1

      -----------------

    1 0001000 000100001

      001000 0001000010

      000100 0000100001

      -----------------

    0 001100 0001100011 <- HSB = 0

      01100 00011000110

      -----------------

    1 01100 00011000110 <- HSB = 1

      1100 000110001100

      0001 000000100001

      -----------------

    1 1101 000110101101 <- HSB = 0

      101 0001101011010

      -----------------

    0 101 0001101011010 <- HSB = 1

      01 00011010110100

      00 01000000100001

      -----------------

    0 01 01011010010101 <- HSB = 0

      1 010110100101010

      -----------------

    0 1 010110100101010 <- HSB = 1

       0101101001010100

       0001000000100001

      -----------------

       0100101001110101 <- CRC


-----此内容被oyggj于2007-05-17,15:09:37编辑过

出0入0汤圆

发表于 2011-9-23 15:36:25 | 显示全部楼层
mark
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-8 00:58

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表