打印

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

[复制链接]
楼主: leasor
手机看帖
扫描二维码
随时随地手机跟帖
61
hotpower| | 2007-4-17 23:21 | 只看该作者 回帖奖励 |倒序浏览

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

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

使用特权

评论回复
62
leasor|  楼主 | 2007-4-23 19:17 | 只看该作者

得到

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

不过还好让联系到原作者,嘿嘿!~

使用特权

评论回复
63
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










  

使用特权

评论回复
64
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

使用特权

评论回复
65
ickx| | 2007-5-20 22:45 | 只看该作者

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

请问有没有谁知道哪有3毛钱左右的单片机?
裸片也行
最近有个东西要求成本很低,不过用的资源也少,5个以上可编程IO口
一个以上定时器,可外接电阻作振荡器或者内置有振荡器
非常感谢

使用特权

评论回复
66
hotpower| | 2011-12-26 13:03 | 只看该作者
顶起来,掀起密码安全教育风暴~~~

使用特权

评论回复
67
lhchen922| | 2013-11-17 20:22 | 只看该作者

使用特权

评论回复
68
zjxcml| | 2013-11-18 09:33 | 只看该作者
呵呵,顶起

使用特权

评论回复
69
hjl714016| | 2013-11-18 17:24 | 只看该作者
谢谢楼主的分享~~
一直没有理解CRC的校验规则,看了楼主的分析,顿时豁然开朗~~

使用特权

评论回复
70
lantian5451| | 2014-6-18 09:53 | 只看该作者
留下脚印

使用特权

评论回复
71
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 —要校验的数组



这样不更简洁吗?

使用特权

评论回复
72
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 —要校验的数组                                          
这不更简洁吗?






使用特权

评论回复
73
kerby81| | 2014-8-14 12:00 | 只看该作者
不错

使用特权

评论回复
74
扫地焚香| | 2014-8-14 17:41 | 只看该作者
MARK,谢谢楼主

使用特权

评论回复
75
kamen588| | 2014-8-15 11:42 | 只看该作者
mark

使用特权

评论回复
76
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;
}

使用特权

评论回复
77
icekoor| | 2014-8-15 12:11 | 只看该作者
平时用的CRC计算器,查看附件。

CRC校验.rar

560.76 KB

CRC计算器

使用特权

评论回复
78
lzzd0918| | 2014-12-1 12:55 | 只看该作者
收藏一下。谢谢楼主分享

使用特权

评论回复
79
yinhaix| | 2015-5-25 11:19 | 只看该作者

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则