CRC冗余码 {#crc}
CRC循环冗余检验码
是数据通信领域中最常用的一种查错校验码,其特征是信息字段和校验字段的长度可以任意选定。循环冗余检查(CRC)是一种数据传输检错功能,对数据进行多项式计算,并将得到的结果附在帧的后面,接收设备也执行类似的算法,以保证数据传输的正确性和完整性。
生成多项式
: 进行模二除法的被除数,如一个生成多项式为P(x) = x^4 + x^3 + 1
,那么被除数就是1*x^4 + 1*x^3 + 0*x^2 + 0*x^1 + 1*x^0
,为11001
,生成多项式的最高位幂为n
,就有n
位被除数,在原数据后填n
个零,最后冗余码结果就有n-1
位
#include <iostream>
#include <string>
#include <vector>
using namespace std;
string rcr_redundant_Code(string data, string divisor)
{
int divisor_len = divisor.length(); // 5
for (int i = 1; i < divisor_len; i++)
{
data.append(1, '0'); // data='11010110110000'
}
// string dividend = data.substr(0, divisor_len);
int new_data_length = data.length(); // 14
static int index = divisor_len - 1;
string tmp = data.substr(0, divisor_len);
while (index < new_data_length)
{
int i = 0;
for (i; i < divisor_len; i++)
{
if (tmp[i] == divisor[i])
{
tmp[i] = '0';
}
else
{
tmp[i] = '1';
}
}
int head_zero_count = 0; // 此次相除的结果有多少个前置0,所以被除数的下标要向右移动多少位,结果在加上divisor_len-head_zero_count位
for (int k = 0; k < divisor_len; k++)
{
if (tmp[k] == '0')
{
head_zero_count++;
continue;
}
else
{
break;
}
}
i = 0;
if (head_zero_count <= new_data_length - index - 1)
{ // 被除数据剩余部分足够
string add_tmp = data.substr(index + 1, head_zero_count); // 补足数据
index += head_zero_count;
tmp = tmp.substr(head_zero_count);
tmp += add_tmp; // 补齐结果(下一次的除数)
}
else
{ // 被除数据剩余部分不够(因为前置零的补足)
string add_tmp = data.substr(index + 1);
tmp += add_tmp;
break;
}
}
return tmp;
}
int test02()
{
string data, divisor;
cout << "请输入待传输的二进制串: "; // 1101011011
cin >> data;
cout << "请输入被除数(循环冗余码): "; // 10011
cin >> divisor;
string result;
result = rcr_redundant_Code(data, divisor); // 带前置0的结果
int count = 0;
for (int i = 0; i < result.length(); i++)
{
if (result[i] == '0')
{
count++;
continue;
}
else
{
break;
}
}
result = result.substr(count); // 去除前置0
if (result.length() < (divisor.length() - 1))
{
string tmp;
tmp.append(divisor.length() - 1 - result.length(), '0');
result = tmp + result;
}
cout << result;
return 0;
}