zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    宝贝,对不起
    转帖]四川人逆境中的幽默(整理)
    见闻大量急救车急速行驶有感
    5月16日当代第一IT诗人代腾飞17XIE在线访谈(转)
    陈风莲(帮别人名字作诗)
    愉快且卓有成效:培养你与人相处的能力
    夜半再次遭遇地震
    请允许我像亲人一样去爱你
    DiscoveryService.getRemoteAdvertisements是否会获得本地通告?
    windowClosed事件不响应
  • 原文地址:https://www.cnblogs.com/yang131/p/13268052.html
Copyright © 2011-2022 走看看