自己写过的, 希望对你有帮助
Cyclic Redundancy Check(CRC) 原理及实现
///
1: 需求
在数据传送过程中,为了能够进行错误检测, 往往在数据后追加一些检测码,
当接受方收到了数据后, 用同样的算法进行计算检测码, 如果一致说明数据
正确, 否则通知发送方重新发送。 现假定数据为6 23 44:
历史上出现过多个算法, 如:
累加求模:
(6+23+4)%256 == 33, 则发送数据6 23 44 33
XOR:
(6^ 23 ^4) = 21 则发送数据 6 23 4 21
然而, 这却不是好的算法, 好的算法要求数据的数据能散列的分布在检测码
中, 对于累加求模的(6 24 3 )以及xor的(6 22 5)都能输出同样的检测码
于是, CRC诞生了。
///
///
2:CRC的背景理论
crc将数据追加结尾的wbit的0当作一个很大阶的多项式, 用它去除于另一个双方约定的多项式,
得到的余数, 则为检测码,其中w为约定多项式的最大阶数, 最后传输原始数据追加检测码,
其中任何一位发生变化, 都导致最后得到的结果差别很大,
CRC因为容易简单实现以及容错性强, 而被广泛使用。
追加wbit的好处是, 整个传输的数据刚刚能够被约定的多项式
p1|00..00| / p2 = p3 .....p4
则(p1|00.00|+p4) / p2 = p3....0
p1|00.00|+p4 = p1|p4| (后面的多项式运算能够证明)
这里为了方便说明, 下列进行运行的数据都没有追加结尾的0
这里有2个问题, 如何把数据流转换成多项式, 以及如何做多项式的除法。
数据流的转换:
假如有2个byte(6,23)我们把他转成16进制为0617, 二进制表示为
0000 0110 0001 0111 对应多项式 x^10 + x^9 + x^4 + x^2 + x^1 + 1
多项式除法:
先说多项式加法, 多项式x^4 + x^2 + x + 1 和多项式x^4+x^3+1
为 2*x^4 + x^3 + x^2 + x^1 + 2*(x^0)
由于x是个未知数, 不知道怎么进行系数和阶的转换, 于是规定:
"如果系数mod2==0, 那么