主题:[讨论]悟空,CRC原来是这么回事!
leasor
[专家分:30] 发布于 2007-04-05 10:02:00
悟空:师傅,最近我被CRC搞的头晕脑涨?
~~~:那是何方神圣?
悟空:CRC通用数据传送的校验编码。
~~~:555,
悟空:????
~~~:加快追赶青春的脚步,飞速与世界接吻咯。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
几天后,
悟空:师傅你怎满脸青一块紫一块?
~~~:FANS太多,还真让人伤脑筋啊~~~~~~~~~~~
悟空:知道自己是近视眼,就别盯着别人的MM,被暴打了把。
~~~:多年不出山,没想到还怎么受欢迎!
悟空:观音姐姐,救救我~~~~~~
……—¥%……¥……¥%##¥%#%¥#%#%%%¥
悟空:让你没事就长篇大论,我T~~~~
~~~: 我招了
回复列表 (共13个回复)
沙发
leasor [专家分:30] 发布于 2007-04-05 10:11:00
CRC远没有网上所说那么简单。
首先我们有一个数据流,也就是你需要校验的数据,可以是N BIT,一般我们常用的4,8,16,32,128 BIT,这里我取几个8的倍数,是因为我们的硬件以二进制为基础,所以在存取数据比较容易,无须充填位数来满足寄存器的要求。你用13,17,29 BIT也可以。
有一点你要记住的是,你选用几个BIT,那么在CRC编码就需要移位几次,8就是移位8次,13就是移位13次,128就是移位128次。
板凳
leasor [专家分:30] 发布于 2007-04-05 10:20:00
先投诉一下这里的管理员,N年了还是不能嵌入图片,郁闷!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
我们看看目前为止的CRC的标准或者行规有:
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
需要说明的:CRC后所带的数字就是CRC的位数,它与你的数据流是无关的。
CRC8,8位CRC校验。
CRC16,16位CRC校验。
CRC12,12位CRC校验。
CRC32,32位CRC校验。
CRC-CCITT,16位CRC校验。
3 楼
leasor [专家分:30] 发布于 2007-04-05 10:29:00
我们看到5个多项式,它的意义其实就是给出一个与数据流进行异或运算的初始值,
当然你可以更改这个值。比如:
CRC8 = X8+X5+X4+1 》》》 CRC8 = X7+X3+X2+1
CRC16 = X16+X15+X5+1 》》》CRC16 = X15+X5+1
只要你做出的东西是相互连接,不用与其他的机器对接,推荐保密部门使用该方法。
如果修改上述的多项式,那么别人在分析你传送来的数据时,该全部是错码。
4 楼
leasor [专家分:30] 发布于 2007-04-05 10:34:00
补一下课:
异或操作:
RESULT
0 0 0
0 1 1
1 0 1
1 1 0
5 楼
leasor [专家分:30] 发布于 2007-04-05 10:58:00
[img]http://pic.tiexue.net/pics/2007_4_5_62058_5162058.jpg[/img]
CRC8 = X8+X5+X4+1
X8 表示第7位需要异或运算
X5 表示第4位需要异或运算
X4 表示第3位需要异或运算
1 表示第0位需要异或运算
如图,首先将CRC所有位清0。
假设我们的数据流为8位,数据流 == 00000011,并且从0位(LSB)开始送入CRC中,则有:
1)1000 1 100
1)1100 1 010
0)0110 0 101
0)1011 1 110
0)0101 1 111
0)1010 0 011
0)1101 1 101
0)1110 0 010
我们看看这个数:
1110 0010 == 0XE2 --- 结果是错的
0100 0111 == 0X47 --- CRC
6 楼
leasor [专家分:30] 发布于 2007-04-05 11:24:00
[img]http://pic.tiexue.net/pics/2007_4_5_62181_5162181.jpg[/img]
CRC16 = X16+X15+X5+1
X16 表示第15位需要异或运算
X15 表示第14位需要异或运算
X5 表示第4位需要异或运算
1 表示第0位需要异或运算
如图,首先将CRC所有位清0。
假设我们的数据流为8位,数据流 == 00000011,并且从0位(LSB)开始送入CRC中,则有:
1)10000 1000000000 1
1)01000 0100000000 0
0)00100 0010000000 0
0)00010 0001000000 0
0)00001 0000100000 0
0)00000 1000010000 0
0)00000 0100001000 0
0)00000 0010000100 0
CRC
0001 0000 1000 0000 == 0X1080
7 楼
leasor [专家分:30] 发布于 2007-04-05 11:34:00
CRC12 = X12+X11+X3+X2+1
CRC32 = X32+X26+X23+X22+X16+X12+X11+X10+X8+X7+X5+X4+X2+X1+1
以上述两个例子,自行推倒。
8 楼
leasor [专家分:30] 发布于 2007-04-05 11:35:00
CRC-CCITT=X16+X12+X5+1
比较特殊,所以再说说
[img]http://pic.tiexue.net/pics/2007_4_5_62270_5162270.jpg[/img]
CRC-CCITT 不同于 CRC-16在于它是个反相的CRC-16,所谓反相的意义指从第7位(MSB)开始移入CRC移位寄存器,
如图,首先将CRC所有位清0。
假设我们的数据流为8位,数据流 == 00000011,并且从7位(MSB)开始送入CRC中,则有:
0)00000 0000000 0000
0)00000 0000000 0000
0)00000 0000000 0000
0)00000 0000000 0000
0)00000 0000000 0000
0)00000 0000000 0000
1)10000 1000000 1000
1)11000 1100000 1100
CRC
0011 0000 0110 0011 == 0X3063
9 楼
leasor [专家分:30] 发布于 2007-04-05 11:47:00
请教高手:
全字节和半字节查表CRC的工作原理的不同在那里?谢谢!
10 楼
dengll23 [专家分:30] 发布于 2007-04-05 13:58:00
CRC是干什么的....
我来回复