CRC查表法运算原理

CRC校验是依据多项式模2运算进行的,这里有两点:

1. 一个二进制串总可以表示为多项式,例如:

10101 表示为 x^{4}+x^{2}+1

10111 表示为x^{4}+x^{2}+x^{1}+1 ,依次类推更长数据的表示方法。

2. 模2运算的基本规则如下:

加法:0+0=0 1+0=1 0+1=1 1+1=0   不进位

减法:0-0=0 0-1=1 1-0=1 1-1=0  不借位

模2加减运算与二进制异或运算相同

乘法:依据多项式模2加法算得 (x^{2}+1)(x^{4}+x^{2}+1) = x^{6}+x^{4}+x^{4}+x^{2}+x^{2}+1 = x^{6}+1

除法:依据多项式模2减法算得 \frac{x^{6}+1}{x^{2}+1}  

每次相减都是模2减法,当余数位数小于除数位数时,运算结束。

多项式模2运算满足分配律和结合律:已知多项式X(n) \ X(m) \ X(k)  则

(X(n)+X(m))X(k) = X(n)X(k)+X(m)X(k)

(X(n)+X(m))/X(k) = X(n)/X(k)+X(m)/X(k)

若多项式X(n)X(m)分别以X(k)作为除数模2除求得的余数为NM,则

 X(n)+X(m)以除数X(k)求得的余数 = (N+M)以除数X(k)求得的余数

一个多项式模2加上自身恒为0,即X(n)+X(n) = 0

CRC校验码生成方式为模2除求余,但CRC校验码不是模2运算的余数。准备一组待发送的二进制数据和一个除数(位数为n),将二进制数据左移n位,再依照多项式模2除法除以除数,直至二进制数据的所有bit位均被除数覆盖为止,得到的余数即为CRCn的校验码。此处与模2除法不同之处在于:即使余数仍可除也不再继续运算,不以余数位数作为结束条件。例如CRC8校验码生成方法为:待发送二进制数据左移8位,右端补0,将左移后的数据模2除以除数,算得CRC8的校验码。

发送端和接收端事先约定一个除数,发送端生成CRC校验码,加到左移后的待发送二进制数据上,将加运算后的数据发送给接收端。接收端依次接收二进制数据,首先接收的为多项式高位,最后接收的为二进制低位,按照多项式模2除法将接收到的二进制数据除以事先约定的除数,若求得余数为0则接收成功;否则接收失败。

例如待发送数据101001110100001,除数111010101共9位,将待发送数据左移9位,进行多项式模2除法,运算过程如下:

求得余数为100011000。最后发送端发送的数据为:101001110100001 100011000,后9位为余数。接收端获得二进制数据串后,直接用100011000模2除,可求得余数为0。如果传输过程中某些bit位反转,则接收端用100011000模2除,很大概率余数不为0。

3. 模2运算的特点

假设待发送二进制数据的某个片段为10100111010000100...,除数为111010101。为了方便表述,将待发送数据分为每9位一块,进行模2除法,如下图所示:

对于每块数据的求余,其运算相当于该块异或上述加红二进制串。例如中间块100001000,余数= 该块 ^ 100000000 ^ 010000000 ^ 010101000 ^ 101010100 = 该块^a^b^c^d; 其中a、b、c、d表示这些二进制块;当该块异或所得<除数时开始后一块的异或运算。

例如:中间块100001000异或所得依次为000001000  010001000 000100000 101110100,101110100 < 111010101时开始后一块的运算。

根据异或的结合律,余数= 该块^a^b^c^d = 该块 ^(a^b^c^d)。 a、b、c、d的数值与前一块相关。

CRC查表法原理

现构建一个表格,将每一块所对应的a^b^c^d存储起来。输入一个数据块,查表得到下一块需要异或的数值。例如上例中101001110对应表格内容为100000000 ^ 010000000 ^ 010101000 ^ 101010100,其刚好是101001110的CRC校验码。

某块的余数 = 该块^上一块查表输出。依次向后计算得到最后一块的余数,即为二进制串的CRC校验码。实现伪码为:

crc_table[2^n];
for(i : 2^n)
   crc_table[i] = i的CRCn校验码;

crc = input; //输入1块
while
   input + 1
   crc = crc_table[crc]^(input);

在计算CRC8时表格需要2^{8}项,计算CRC16时表格需要2^{16}项,CRC32则需要很大的表格,资源浪费十分严重。对于CRC32运算,仍使用2^{8}项的表格,每一项为8位数据对应的CRC32校验码,让输入数据流依次按字节移动并与查表输出值异或即得到CRC32校验码。除表格不同外,其他过程与CRC8运算相似。

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值