循环冗余检测(Cyelie Redundancy Check)
CRC编码也称为多项式编码。
CRC编码操作如下。考虑d比特的数据D,发送节点要将它发送给接收节点。发送方和接收方必须首先协商一个r+1比特模式,称为生成多项式,我们将其表示为G。
我们将要求G的最高有效位的比特是1,CRC编码的关键思想如图所示,对于一个给定的数据D,发送方要选择r个附加比特R,并将它们附加到D上,使得得到的d+r比特模式用模二算术恰好能被其整除,用CRC进行差错检测的过程,因此很简单,接收方用G去除接收到的d+r比特,如果余数为非零,接收方知道出现了差错,否则认为数据正确而被接受
d比特 | r比特 |
---|---|
D: 被发送的数据比特 | R: CRC比特 |
C++实现计算FCS的代码:
#include <iostream>
#include <cmath>
#include <bitset>
using namespace std;
/*FCS检验序列*/
int FCS(int D, int G)
{
int Dw; /*D的位数*/
const int Gw= log(G) / log(2) + 1;/*计算G的位数,是定值*/
int temp; /*中间变量*/
int mask; /*掩码*/
D = D * pow(2, Gw-1); /*把D右移的长度减一位*/
while (D > G)
{
Dw = log(D) / log(2)+1; /*计算D的位数*/
temp = D >> (Dw - Gw); /*取出D的前Gw位,以便与G进行异或运算*/
temp = temp ^ G; /*异或*/
mask = pow(2, Dw - Gw) - 1;
D = D & mask; /*把D的前Gw为去掉*/
temp = temp << (Dw - Gw);
D = D + temp; /*更新D的值*/
}
return temp;
}
int main()
{
int D = 0b101110;
int G = 0b1001;
cout<< bitset<3>(FCS(D,G)) << endl;
system("pause");
}
代码运行结果
参考书籍:《计算机网络自顶向下方法》