CRC 校验(循环冗余检测)

这个CRC在大一的时候就已经学习了,当时看的还很懂的样子,但是现在又什么都忘记了。于是找来《计算机网络》重新温习一下,同时也做一个笔记,方便以后查阅。

CRC编码也称为多项式编码。在网络传输过程中,在帧的结构中,有一个CRC校验。

CRC编码操作如下:

假如我们有一个长度为d比特的数据D,发送节点要发送到接收节点。发送方和接收方必须事先商量一个r+1比特的模式,称为生成多项式,我们将其表示为G(G的最高有效位必须为1)。然后根据D与G的运算得到一个r比特的R,然后D+R一起发送到接收节点,接收节点根据接收到的数据D+R和事先商量好的G进行除运算,如果相除于是为0就没错,非零就是传输过程出错。

主要是这个发送端和接收端如何运算的问题了。

所有CRC计算采用模2运算。

CRC加法运算规则:0+0=0

0+1=1 

1+0=1

1+1=0 (注意:没有进位)

CRC减法运算规则:

0-0=0

0-1=1

1-0=1

1-1=0

CRC乘法运算规则:

0*0=0

0*1=0

1*0=0

1*1=1
除法比较麻烦。其实跟以前的还是一样,理解了就好。具体还是用一个例子来说明吧。比如101110000 除以1001.

                       1 0 1 0 1 1

1001    1 0 1 1 1 0 0 0 0

              1 0 0 1                        (首先商1,然后后面的根据除法这样一样进行运算,只是加减不一样而已)

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

                     1 0 1 0                

                     1 0 0 1

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

                            1  1 0 0

                             1 0  0 1

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

                                 1  0  1 0

                                 1  0   0 1

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

                                      0   1  1 

我们其实是不关心商,我们关心的是余数。因为余数就是我们的CRC。

现在来谈谈我们之前说的运算。

前面说了,如何得到r比特的R呢?其实上面的除法运算已经给出了一个提示。在除法运算中,被除数是D*2^r,余数就是R。

为什么呢?

对于发送接收双方,必须事先商量一个G,要求满足这样的运算。

D*2^r XOR R = nG

也就是说,我们选择R使得G能够除尽D*2^r XOR R 而没有余数。对上面等式两边都用R异或,得到

D*2^r = nG XOR R

R = D*2^r / G 的余数

于是,一切都明朗起来了。

就说说上面那个例子:

D = 101110,假设我们商量好的G=1001,那么r = 3(G的长度减一)。

D*2^3 = 101110000 (左移3位)

然后相除,余数就是011(必须满3位)

于是,我们传送的数据就是101110011.


这个例子在《计算机网络》这本书上详细解释的还是比较清楚的。可以多看看这本书。

CRC 校验,以此记录。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值