xiaosongli 发表于 2009-3-27 15:56:41

CRC32校验码计算代码

网上有很多理论介绍和代码,现整理了一下,经过测试可以使用,代码如下
/*******************************************************************/   
/*
函 数 名 称:        CRC32
功 能 描 述:        执行对数据段的CRC32循环冗余校验
参 数 说 明:        buffer:待校验数据
                     size:待校验数据长度
返回值 说明:        循环冗余校验结果
/*******************************************************************/
unsigned long CRC32(unsigned char *buffer, unsigned long size)   
{
    unsigned long ulPolynomial = 0x04C11DB7;
        int        i, j;
        unsigned long         m_Table;
        unsigned long        Result=0;
       
    for (i = 0; i <= 0xFF; i++)
    {
      m_Table = CRC32_Reflect(i, 8) << 24;
      for (j = 0; j < 8; j++)
            m_Table = (m_Table << 1) ^ (m_Table & (1 << 31) ? ulPolynomial : 0);
      m_Table = CRC32_Reflect(m_Table, 32);
    }
       
        Result = 0xFFFFFFFF;
   
        while (size--)
    {Result = (Result >> 8) ^ m_Table[(Result & 0xFF) ^ *buffer++];}
       
        Result ^= 0xFFFFFFFF;
       
        return Result;
}

unsigned long CRC32_Reflect(unsigned long ref, char ch)
{
    unsigned long value = 0;
        int        i;
    // Swap bit 0 for bit 7, bit 1 for bit 6, etc.
    for(i = 1; i < (ch + 1); i++)
    {
      if (ref & 1)
            value |= 1 << (ch - i);
      ref >>= 1;
    }
    return value;
}

netcreature 发表于 2009-3-27 15:59:16

谢谢分享!

alexander 发表于 2009-3-27 16:17:57

谢谢lz啦

hcwz 发表于 2009-3-28 22:27:46

兄弟啊,有没有16位的CRC码算法啊!
页: [1]
查看完整版本: CRC32校验码计算代码