[转贴]悟空,CRC原来是这么回事!

[复制链接]
17413|78
hotpower 发表于 2007-4-17 23:21 | 显示全部楼层

哈哈~~~汽车电子回来了~~~菜农的网站就有救了~~~

倒塌了~~~被黑客黑搞了2个月~~~

 楼主| leasor 发表于 2007-4-23 19:17 | 显示全部楼层

得到

太痛苦了,花了我三个星期的时间还是一无所获。

不过还好让联系到原作者,嘿嘿!~
 楼主| leasor 发表于 2007-4-23 19:41 | 显示全部楼层

转贴。。。


==================================================================

CRC8  = X8+X5+X4+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 
   
CRC-CCITT=X16+X12+X5+1

  我只做过CRC8和CRC-CCITT,其他只是猜测!
  CRC8的初始校验值应该是100110001,是9位而不是8位。

  数据流=00000001,经过CRC8的处理,如下:
  10001100 0x31
  01000110 0x62
  00100011 0xc4
10011101 0xb9
11000010 0x43
01100001 0x83
10111100 0x3d
01011110 0x7a
======================================
crc=0x7a

data=0x01,要在最后加8个0,即为:
1 00000000 ::100110001
======================================
crc=0x31

data=0x02
10 00000000 :: 100110001
======================================
crc=0x62

data=0x04
100 00000000 :: 100110001
======================================
crc=0xc4

data=0x08
1000 00000000 :: 100110001
======================================
crc=0xb9

data=0x10
10000 00000000 :: 100110001
======================================
crc=0x43

data=0x20
100000 00000000 :: 100110001
======================================
crc=0x83

data=0x40
1000000 00000000 :: 100110001
======================================
crc=0x3d

data=0x80
10000000 00000000 :: 100110001
======================================
crc=0x7a










  

 楼主| leasor 发表于 2007-4-23 19:50 | 显示全部楼层

2

CRC-CCITT=X16+X12+X5+1


初始校验值=1000 1000 0001 00001,是17位而不是16位。

它是反相的,所以
data=0x01,
1000 0000 0000 0000 0000 0000 :: 1000 1000 0001 00001
======================================================
crc=0x1021

其余从略。

至于其他的,我的猜测是:
CRC16 = X16+X15+X5+1 
???== 1100 0000 0001 00001

CRC12 = X12+X11+X3+X2+1 
???== 1100 0000 01101

CRC32 = X32+X26+X23+X22+X16+X12+X11+X10+X8+X7+X5+X4+X2+X1+1
???== 1000 0010 0110 0000 1000 1110 1101 10101
ickx 发表于 2007-5-20 22:45 | 显示全部楼层

请问有没有谁知道哪有3毛钱左右的单片机

请问有没有谁知道哪有3毛钱左右的单片机?
裸片也行
最近有个东西要求成本很低,不过用的资源也少,5个以上可编程IO口
一个以上定时器,可外接电阻作振荡器或者内置有振荡器
非常感谢
hotpower 发表于 2011-12-26 13:03 | 显示全部楼层
顶起来,掀起密码安全教育风暴~~~
lhchen922 发表于 2013-11-17 20:22 | 显示全部楼层
zjxcml 发表于 2013-11-18 09:33 | 显示全部楼层
呵呵,顶起
hjl714016 发表于 2013-11-18 17:24 | 显示全部楼层
谢谢楼主的分享~~
一直没有理解CRC的校验规则,看了楼主的分析,顿时豁然开朗~~
lantian5451 发表于 2014-6-18 09:53 | 显示全部楼层
留下脚印
langgao183 发表于 2014-7-19 11:18 | 显示全部楼层
lixun00 发表于 2007-4-6 09:30
unsigned int cal_crc(unsigned char *pt, unsigned char len) { ...

首先应先确定CRC16的多项式。
我使用的是
           多项式:CRC-CCITT=x^16+x^12+x^5+1  即:0x11021
利用多项式生成crc的生成表。表较大,不上传。

计算crc校验

unsigned int CrcCheck(unsigned char len,unsigned int *ptr)
{
   unsigned int crc = 0;
   unsigned char crc_H8;

  while( len-- )
    {
        crc_H8 = (unsigned char)(crc >> 8);
        crc = crc << 8;
        crc = crc ^ crc_table[ crc_H8 ^ *ptr];
        ptr++;
    }
return crc;
}

len  —要校验的字节数
*ptr —要校验的数组



这样不更简洁吗?
langgao183 发表于 2014-7-19 11:20 | 显示全部楼层
lixun00 发表于 2007-4-6 09:30
unsigned int cal_crc(unsigned char *pt, unsigned char len) { ...

首先应先确定CRC16的多项式。
我使用的是
           多项式:CRC-CCITT=x^16+x^12+x^5+1  即:0x11021
利用多项式生成crc的生成表。表较大,不上传。

计算crc校验

unsigned int CrcCheck(unsigned char len,unsigned int *ptr)
{
   unsigned int crc = 0;
   unsigned char crc_H8;

  while( len-- )
    {
        crc_H8 = (unsigned char)(crc >> 8);
        crc = crc << 8;
        crc = crc ^ crc_table[ crc_H8 ^ *ptr];
        ptr++;
    }
return crc;
}

len  —要校验的字节数
*ptr —要校验的数组                                          
这不更简洁吗?






kerby81 发表于 2014-8-14 12:00 | 显示全部楼层
扫地焚香 发表于 2014-8-14 17:41 来自手机 | 显示全部楼层
MARK,谢谢楼主
kamen588 发表于 2014-8-15 11:42 | 显示全部楼层
icekoor 发表于 2014-8-15 12:09 | 显示全部楼层
哈哈,有意思,我也贴一个:CRC-8/MAXIM         x8+x5+x4+1的程序,希望对大家有用。
//CRC-8/MAXIM   x8+x5+x4+1  计算方法
unsigned char Cal_CRC(unsigned char *ptr,unsigned char len)
{
        unsigned char crc;
        unsigned char i;
            crc = 0;
            while(len--)
            {
               crc^= *ptr++;
               for(i = 0;i < 8;i++)
               {
                   if(crc & 0x01)
                   {
                       crc = (crc >> 1) ^ 0x8C;
                   }
                   else crc >>= 1;
               }
            }
            return crc;
}
icekoor 发表于 2014-8-15 12:11 | 显示全部楼层
平时用的CRC计算器,查看附件。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
lzzd0918 发表于 2014-12-1 12:55 | 显示全部楼层
收藏一下。谢谢楼主分享
yinhaix 发表于 2015-5-25 11:19 | 显示全部楼层
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 在线客服 返回列表 返回顶部