CRC 循环冗余效验

CRC循环冗余效验 利用多项式 x6 + x4 + x3,实际为使用模2除法来做的加密

常用crc多项式有

名称

生成多项式

数值式

简记式

标准引用

CRC-4

x4+x+1

0x1’3

0x3

ITU G.704

CRC-8

x8+x5+x4+1

0x1’31

0x31

CRC-8

x8+x2+x1+1

0x1’07

0x07

CRC-8

x8+x6+x4+x3+x2+x1

0x1’5E

0x5E

CRC-12

x12+x11+x3+x2+x+1

0x1’80F

0x80F

CRC-32c

注**

0X1’1EDC6F41

0x1EDC6F41

SCTP

多项式即要验证数据的除数

过程

a.生成 循环效验的余数 例如;要发送的数据a 对 指定除数模2取余数b(例如crc32的除数0x1EDC6F41),

b.发送数据为a+b,长度len(a)+len(b)

然后发送给目标:

接收之后:

1.对收到的数据 用指定除数(如过程a)进行模2取余数b,

2.如果余数为0,则效验成功,否则失败

区中模2除法取余核心为代码:思路使用deque,然后pushback,分别异或算法

代码如下:

// CRC.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include <vector>
#include <math.h>
#include <cmath>
#include <deque>
using namespace std;

//二进制的位数
int GetBitNum(int n)
{
    int i = 0;
    while (n > 0)
    {
        n = n >> 1;
        i++;
    }
    return i;
}
bool GetBitAt(int n, int pos)
{
    int m = 1 << pos;
    int nRes = n & m;
    return (n & m) > 0;
}
int Left(int n, int count)
{
    int num = GetBitNum(n);
    return    n >> (num - count);
}
int Right(int n, int count)
{
    int n1 = n >> count;
    n1 = n1 << count;
    return n ^ n1;
}

int Mod(int m, int n)
{
    std::deque<int> dqM;
    std::deque<int> dqN;

    int nlen = GetBitNum(n);
    int mlen = GetBitNum(m);
    for (int i = 0; i < nlen; i++)
    {
        int nb = GetBitAt(n, i) ? 1 : 0;
        cout << nb;
        dqN.push_front(nb);
    }
    cout << endl;
    for (int i = 0; i < mlen; i++)
    {
        //
        int nb = GetBitAt(m, i) ? 1 : 0;
        dqM.push_front(nb);
        cout << nb;
    }
    cout << endl;

    while (dqM.size() > dqN.size())
    {
        //这里做运算
        for (int i = 0; i < dqN.size(); i++)
        {
            dqM[i] = dqM[i] ^ dqN[i];
        }
        while (dqM.size() > 0 && dqM.front() == 0)
        {
            dqM.pop_front();
        }
    }
    int t = 0;
    for (int i = 0; i < dqM.size(); i++)
    {
        t += 2 << (dqM.size() - i - 1);
    }
    return t;
}
void printbool(bool bPrint)
{
    if (bPrint)
        cout << 1;
    else
        cout << 0;
}


int main()
{
    /*int n = 1 ^ 1;
    cout << n << endl;
    n = 1 ^ 0;
    cout << n << endl;
    n = 0 ^ 1;
    cout << n << endl;
    n = 0 ^ 0;
    cout << n << endl;*/
    
    //m为要发送的数据
    //n为多项式  1001:= x4+1:
    //余数为要发送的数
    //效验过程, 发送的数据除以多项式 余数为0即校验成功
    
    int m = 12344556;
    int n = 9;
    int mod = Mod(m, n);
    //发送的数字为m+n
    int mlen = GetBitNum(m);
    //长度
    int nReal = mlen + GetBitNum(mod);

    int nRealSend = m << GetBitNum(mod) + m;
    int nn = Mod(nRealSend, n);
    cout << nn << endl;

    return 0;
}
原文地址:https://www.cnblogs.com/yang131/p/13268052.html