CRC1021 C 实现.doc


文档分类:IT计算机 | 页数:约5页 举报非法文档有奖
1/5
下载提示
  • 1.该资料是网友上传的,本站提供全文预览,预览什么样,下载就什么样。
  • 2.下载该文档所得收入归上传者、原创者。
  • 3.下载的文档,不会出现我们的网址水印。
1/5
文档列表 文档介绍
CRC1021 C++ 实现
CRC算法是在通讯领域广泛采用的校验算法。原理我就不说了,这里说一下简单的程序实现。以下均采用CRC多项式为0x1021即:
g(x) = x16+x12+x5+x0;CRC的基本原理就不说了,那个搜一下就有了。
       最基本的算法应该是按位计算了,这个方法可以适用于所有长度的数据校验,最为灵活,但由于是按位计算,其效率并不是最优,只适用于对速度不敏感的场合。基本的算法如下:
unsigned short do_crc_16(unsigned char *message, unsigned int len)
{
    int i, j;
    unsigned short crc_reg = 0;
    unsigned short current;
      
    for (i = 0; i < len; i++)
    {
        current = message[i] << 8;
        for (j = 0; j < 8; j++)
        {
            if ((short)(crc_reg ^ current) < 0)
                crc_reg = (crc_reg << 1) ^ 0x1021;
            else
                crc_reg <<= 1;
            current <<= 1;          
        }
    }
    return crc_reg;
}
以是方法可以计算出任意长度数据的校验。但速度慢。下面介绍一种按字节计算的方法:
按字节校验是每次计算8位数据,多是基于查表的算法,首先要准备一个表,一共256项。
unsigned int crc_ta[256]={               /* CRC余式表*/
    0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7,
    0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef,
    0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,
    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de,
    0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485,
    0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,
    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4,
    0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d,

CRC1021 C 实现 来自淘豆网www.taodocs.com转载请标明出处.

非法内容举报中心
文档信息
  • 页数5
  • 收藏数0 收藏
  • 顶次数0
  • 上传人mh900965
  • 文件大小44 KB
  • 时间2018-01-03