CRC 32 校验

CRC即循环冗余校验码(Cyclic Redundancy Check[1] )。它是一类重要的线性分组码,编码和解码方法简单,检错和纠错能力强,在通信领域广泛地用于实现差错控制。

参数模型 
这个很重要,计算CRC值时,不仅仅是生成项POLY会影响到CRC值,还有很多参数会影响到最终的CRC值! 我也是查了很久才知道,晕死,在网上找了好多算法,都不是我要的结果(和另一端校验值相等的结果,另一端是个糊涂人,也不知道参数模型,不知道从哪找的例子,copy出来就用,可惜是fpga语言,上位机不能用,可苦了我了)

CRC计算,需要有CRC参数模型,比如CRC32的参数模型是: 
Width : 32 
Poly : 04C11DB7 
RefIn : True 
RefOut : True 
XorOut : FFFFFFFF

在这里记录一下crc 32的生成代码。

  • CRC-32的预置码表

    计算时要选取一个多项式作为除数,一般CRC-32选取如下三个多项式值中的一个 
    Polynomial representations

    1. Normal :0x04C11DB7
    2. Reversed :0xEDB88320
    3. Reversed reciprocal :0x82608EDB

在实际数据通讯时,信息字节先传送或先接收低位字节,这时候使用翻转反转多项(这样避免翻转数据,增加运算量)

static uint CRC32_Tbl[256];       //用来保存CRC32码表

void GenCrc32Tbl()
{
    uint CRC;
    for(int i=0; i<256; i++)
    {
        CRC=i;
        //这个循环实际上就是用"计算法"来求取CRC的校验码
        for(int j=0; j<8; j++){   
            if(CRC&1)//最高位为1,将它与poly做XOR运算
                CRC=(CRC>>1)^0xEDB88320;//0xEDB88320是选的CRC-32多项表达式的值
            else //否则我们只是将左移一位 翻转多项式是右移一位
                CRC>>=1;
        }
        CRC32_Tbl[i]=CRC;
    }
}
     
     
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • CRC 32 
    余数初始值(Initial value):0xFFFFFFFF 
    结果异或值 (Final XOR value):0xFFFFFFFF
uint Get_CRC32(const unsigned  char *buf, int size)
{
    uint i, CRC;

    CRC = 0xFFFFFFFF;//#define INIT  0xFFFFFFFF  // 余数初始值   Initial value
    for (i = 0; i < size; i++)
        CRC = CRC32_Tbl[(CRC ^ buf[i]) & 0xff] ^ (CRC >> 8);
    return CRC^0xFFFFFFFF;//#define XOROT 0xFFFFFFFF // 结果异或值  Final XOR value
}
     
     
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

我使用的是另一种, MPEG-2的参数模型,这里先不列出来代码了。其实只是涉及到了位的反转



CRC即循环冗余校验码(Cyclic Redundancy Check[1] )。它是一类重要的线性分组码,编码和解码方法简单,检错和纠错能力强,在通信领域广泛地用于实现差错控制。

参数模型 
这个很重要,计算CRC值时,不仅仅是生成项POLY会影响到CRC值,还有很多参数会影响到最终的CRC值! 我也是查了很久才知道,晕死,在网上找了好多算法,都不是我要的结果(和另一端校验值相等的结果,另一端是个糊涂人,也不知道参数模型,不知道从哪找的例子,copy出来就用,可惜是fpga语言,上位机不能用,可苦了我了)

扫描二维码关注公众号,回复: 4536599 查看本文章

CRC计算,需要有CRC参数模型,比如CRC32的参数模型是: 
Width : 32 
Poly : 04C11DB7 
RefIn : True 
RefOut : True 
XorOut : FFFFFFFF

在这里记录一下crc 32的生成代码。

  • CRC-32的预置码表

    计算时要选取一个多项式作为除数,一般CRC-32选取如下三个多项式值中的一个 
    Polynomial representations

    1. Normal :0x04C11DB7
    2. Reversed :0xEDB88320
    3. Reversed reciprocal :0x82608EDB

在实际数据通讯时,信息字节先传送或先接收低位字节,这时候使用翻转反转多项(这样避免翻转数据,增加运算量)

static uint CRC32_Tbl[256];       //用来保存CRC32码表

void GenCrc32Tbl()
{
    uint CRC;
    for(int i=0; i<256; i++)
    {
        CRC=i;
        //这个循环实际上就是用"计算法"来求取CRC的校验码
        for(int j=0; j<8; j++){   
            if(CRC&1)//最高位为1,将它与poly做XOR运算
                CRC=(CRC>>1)^0xEDB88320;//0xEDB88320是选的CRC-32多项表达式的值
            else //否则我们只是将左移一位 翻转多项式是右移一位
                CRC>>=1;
        }
        CRC32_Tbl[i]=CRC;
    }
}
  
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • CRC 32 
    余数初始值(Initial value):0xFFFFFFFF 
    结果异或值 (Final XOR value):0xFFFFFFFF
uint Get_CRC32(const unsigned  char *buf, int size)
{
    uint i, CRC;

    CRC = 0xFFFFFFFF;//#define INIT  0xFFFFFFFF  // 余数初始值   Initial value
    for (i = 0; i < size; i++)
        CRC = CRC32_Tbl[(CRC ^ buf[i]) & 0xff] ^ (CRC >> 8);
    return CRC^0xFFFFFFFF;//#define XOROT 0xFFFFFFFF // 结果异或值  Final XOR value
}
  
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

我使用的是另一种, MPEG-2的参数模型,这里先不列出来代码了。其实只是涉及到了位的反转



猜你喜欢

转载自blog.csdn.net/ccy764417301/article/details/80045795