C++实现CRC冗余校验中FCS检测序列的生成

循环冗余检测(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");

}

代码运行结果
在这里插入图片描述
参考书籍:《计算机网络自顶向下方法》

发布了9 篇原创文章 · 获赞 2 · 访问量 668

猜你喜欢

转载自blog.csdn.net/qq_41195985/article/details/103643331
今日推荐