打印
[技术问答]

CRC16常用算法

[复制链接]
448|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
loutin|  楼主 | 2024-8-24 07:02 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式



/****************************Info********************************************** 
* Name:    CRC-16/CCITT        x16+x12+x5+1
* Width:        16
* Poly:    0x1021
* Init:    0x0000
* Refin:   True
* Refout:  True
* Xorout:  0x0000
* Alias:   CRC-CCITT,CRC-16/CCITT-TRUE,CRC-16/KERMIT
*****************************************************************************/
#if 0
unsigned short CRC16_CCITT(unsigned char *data, unsigned int datalen)
{
        unsigned short wCRCin = 0x0000;
        unsigned short wCPoly = 0x1021;
        unsigned char wChar = 0;
       
        while (datalen--)        
        {
                wChar = *(data++);
                InvertUint8(&wChar,&wChar);
                wCRCin ^= (wChar << 8);
                for(int i = 0;i < 8;i++)
                {
                        if(wCRCin & 0x8000)
                                wCRCin = (wCRCin << 1) ^ wCPoly;
                        else
                                wCRCin = wCRCin << 1;
                }
        }
        InvertUint16(&wCRCin,&wCRCin);
        return (wCRCin);
}
#else
//这里为了效率,我们不需要将所有Refin和refout为true的输入输出数据移位转换
//只需要将poly二项式转换后,运算时将左移变为右移
unsigned short CRC16_CCITT(unsigned char *data, unsigned int datalen)
{
        unsigned short wCRCin = 0x0000;
        unsigned short wCPoly = 0x1021;
        unsigned char wChar = 0;
       
        InvertUint16(&wCPoly,&wCPoly);
        while (datalen--)        
        {
                wCRCin ^= *(data++);
                for(int i = 0;i < 8;i++)
                {
                        if(wCRCin & 0x01)
                                wCRCin = (wCRCin >> 1) ^ wCPoly;
                        else
                                wCRCin = wCRCin >> 1;
                }
        }
        return (wCRCin);
}
#endif


使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

55

主题

1301

帖子

0

粉丝