crc循环冗余码

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;
}
  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

0zxm

祝大家天天开心

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值