几种常见的CRC校验算法

//.h

unsigned char CRC8(unsigned char* ucPuchMsg, unsigned int unDataLen);
unsigned char CRC8_ITU(unsigned char* ucPuchMsg, unsigned int unDataLen);
unsigned char CRC8_ROHC(unsigned char* ucPuchMsg, unsigned int unDataLen);
unsigned char CRC8_MAXIM(unsigned char* ucPuchMsg, unsigned int unDataLen);
unsigned char CRC8_CUSTOM(unsigned char* ucPuchMsg, unsigned int unDataLen
                                                   , unsigned char ucPoly/*多项式 POLY*/
                                                   , unsigned char ucInit/*初始值 INIT*/
                                                   , bool bRefIn/*输入数据反转*/
                                                   , bool bRefOut/*输出数据反转*/
                                                   , unsigned char ucXorOut/*结果异或值 XOROUT*/);
unsigned short CRC16_CCITT(unsigned char* ucPuchMsg, unsigned int unDataLen);
unsigned short CRC16_CCITT_FALSE(unsigned char* ucPuchMsg, unsigned int unDataLen);
unsigned short CRC16_XMODEM(unsigned char* ucPuchMsg, unsigned int unDataLen);
unsigned short CRC16_X25(unsigned char* ucPuchMsg, unsigned int unDataLen);
unsigned short CRC16_MODBUS(unsigned char* ucPuchMsg, unsigned int unDataLen);
unsigned short CRC16_IBM(unsigned char* ucPuchMsg, unsigned int unDataLen);
unsigned short CRC16_MAXIM(unsigned char* ucPuchMsg, unsigned int unDataLen);
unsigned short CRC16_USB(unsigned char* ucPuchMsg, unsigned int unDataLen);
unsigned short CRC16_DNP(unsigned char* ucPuchMsg, unsigned int unDataLen);
unsigned short CRC16_BUYPASS(unsigned char* ucPuchMsg, unsigned int unDataLen);
unsigned short CRC16_CUSTOM(unsigned char* ucPuchMsg, unsigned int unDataLen
                                                   , unsigned short usPoly/*多项式 POLY*/
                                                   , unsigned short usInit/*初始值 INIT*/
                                                   , bool bRefIn/*输入数据反转*/
                                                   , bool bRefOut/*输出数据反转*/
                                                   , unsigned short usXorOut/*结果异或值 XOROUT*/);
//.cpp

/**
**************************************************************************************************
* @Brief    Single byte data inversion
* @Param
*            @DesBuf: destination buffer
*            @SrcBuf: source buffer
* @RetVal    None
* @Note      (MSB)0101_0101 ---> 1010_1010(LSB)
**************************************************************************************************
*/
void InvertUint8(unsigned char* DesBuf, unsigned char* SrcBuf)
{
    int i;
    unsigned char temp = 0;

    for (i = 0; i < 8; i++)
    {
        if (SrcBuf[0] & (1 << i))
        {
            temp |= 1 << (7 - i);
        }
    }
    DesBuf[0] = temp;
}

/**
**************************************************************************************************
* @Brief    double byte data inversion
* @Param
*            @DesBuf: destination buffer
*            @SrcBuf: source buffer
* @RetVal    None
* @Note      (MSB)0101_0101_1010_1010 ---> 0101_0101_1010_1010(LSB)
**************************************************************************************************
*/
void InvertUint16(unsigned short* DesBuf, unsigned short* SrcBuf)
{
    int i;
    unsigned short temp = 0;

    for (i = 0; i < 16; i++)
    {
        if (SrcBuf[0] & (1 << i))
        {
            temp |= 1 << (15 - i);
        }
    }
    DesBuf[0] = temp;
}

unsigned char CRC8(unsigned char *ucPuchMsg, unsigned int unDataLen)
{
    return CRC8_CUSTOM(ucPuchMsg, unDataLen, 0x07, 0x00, false, false, 0x00);
}

unsigned char CRC8_ITU(unsigned char *ucPuchMsg, unsigned int unDataLen)
{
    return CRC8_CUSTOM(ucPuchMsg, unDataLen, 0x07, 0x00, false, false, 0x55);
}

unsigned char CRC8_ROHC(unsigned char *ucPuchMsg, unsigned int unDataLen)
{
    return CRC8_CUSTOM(ucPuchMsg, unDataLen, 0x07, 0xFF, true, true, 0x00);
}

unsigned char CRC8_MAXIM(unsigned char *ucPuchMsg, unsigned int unDataLen)
{
    return CRC8_CUSTOM(ucPuchMsg, unDataLen, 0x31, 0x00, true, true, 0x00);
}

unsigned char CRC8_CUSTOM(unsigned char *ucPuchMsg, unsigned int unDataLen, unsigned char ucPoly, unsigned char ucInit, bool bRefIn, bool bRefOut, unsigned char ucXorOut)
{
    unsigned char wChar = 0;

    while (unDataLen--)
    {
        wChar = *(ucPuchMsg++);
        if(bRefIn)
            InvertUint8(&wChar, &wChar);
        ucInit ^= wChar;

        for (int i = 0; i < 8; i++)
        {
            if (ucInit & 0x80)
            {
                ucInit = (ucInit << 1) ^ ucPoly;
            }
            else
            {
                ucInit = ucInit << 1;
            }
        }
    }
    if(bRefOut)
        InvertUint8(&ucInit, &ucInit);
    return (ucInit ^ ucXorOut);
}

unsigned short CRC16_CCITT(unsigned char *ucPuchMsg, unsigned int unDataLen)
{
    return CRC16_CUSTOM(ucPuchMsg, unDataLen, 0x1021, 0x0000, true, true, 0x0000);
}

unsigned short CRC16_CCITT_FALSE(unsigned char *ucPuchMsg, unsigned int unDataLen)
{
    return CRC16_CUSTOM(ucPuchMsg, unDataLen, 0x1021, 0xFFFF, false, false, 0x0000);
}

unsigned short CRC16_XMODEM(unsigned char *ucPuchMsg, unsigned int unDataLen)
{
    return CRC16_CUSTOM(ucPuchMsg, unDataLen, 0x1021, 0x0000, false, false, 0x0000);
}

unsigned short CRC16_X25(unsigned char *ucPuchMsg, unsigned int unDataLen)
{
    return CRC16_CUSTOM(ucPuchMsg, unDataLen, 0x1021, 0xFFFF, true, true, 0xFFFF);
}

unsigned short CRC16_MODBUS(unsigned char *ucPuchMsg, unsigned int unDataLen)
{
    return CRC16_CUSTOM(ucPuchMsg, unDataLen, 0x8005, 0xFFFF, true, true, 0x0000);
}

unsigned short CRC16_IBM(unsigned char *ucPuchMsg, unsigned int unDataLen)
{
    return CRC16_CUSTOM(ucPuchMsg, unDataLen, 0x8005, 0x0000, true, true, 0x0000);
}

unsigned short CRC16_MAXIM(unsigned char *ucPuchMsg, unsigned int unDataLen)
{
    return CRC16_CUSTOM(ucPuchMsg, unDataLen, 0x8005, 0x0000, true, true, 0xFFFF);
}

unsigned short CRC16_USB(unsigned char *ucPuchMsg, unsigned int unDataLen)
{
    return CRC16_CUSTOM(ucPuchMsg, unDataLen, 0x8005, 0xFFFF, true, true, 0xFFFF);
}

unsigned short CRC16_DNP(unsigned char *ucPuchMsg, unsigned int unDataLen)
{
    return CRC16_CUSTOM(ucPuchMsg, unDataLen, 0x3D65, 0x0000, true, true, 0xFFFF);
}

unsigned short CRC16_BUYPASS(unsigned char* ucPuchMsg, unsigned int unDataLen)
{
    return CRC16_CUSTOM(ucPuchMsg, unDataLen, 0x8005, 0x0000, false, false, 0x0000);
}

unsigned short CRC16_CUSTOM(unsigned char *ucPuchMsg, unsigned int unDataLen, unsigned short usPoly, unsigned short usInit, bool bRefIn, bool bRefOut, unsigned short usXorOut)
{
    unsigned char wChar = 0;

    while (unDataLen--)
    {
        wChar = *(ucPuchMsg++);
        if(bRefIn)
            InvertUint8(&wChar, &wChar);
        usInit ^= (wChar << 8);

        for (int i = 0; i < 8; i++)
        {
            if (usInit & 0x8000)
            {
                usInit = (usInit << 1) ^ usPoly;
            }
            else
            {
                usInit = usInit << 1;
            }
        }
    }
    if(bRefOut)
        InvertUint16(&usInit, &usInit);
    return (usInit ^ usXorOut);
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值