汽车电子 -- CRC校验码详解

2024-02-25 19:20

本文主要是介绍汽车电子 -- CRC校验码详解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

常用的校验算法有奇偶校验、校验和、CRC,还有LRC、BCC等不常用的校验算法。
参看:汽车电子 – CCITT标准CRC16(1021)
参看:STM32开发 – CRC校验码
参看:DSP学习–BCC校验(异或校验)

一、CRC简介

1、什么是CRC校验?

CRC(Cyclic Redundancy Check)即循环冗余校验码:是数据通信领域中最常用的一种查错校验码,其特征是信息字段和校验字段的长度可以任意选定。循环冗余检查(CRC)是一种数据传输检错功能,对数据进行多项式计算,并将得到的结果附在帧的后面,接收设备也执行类似的算法,以保证数据传输的正确性和完整性。

2、CRC参数模型

一个完整的CRC参数模型应该包含以下信息:WIDTH,POLY,INIT,REFIN,REFOUT,XOROUT。

  • NAME:参数模型名称。
  • WIDTH:宽度,即生成的CRC数据位宽,如CRC-8,生成的CRC为8位
  • POLY:十六进制多项式,省略最高位1,如 x8 + x2 + x + 1,二进制为1 0000 0111,省略最高位1,转换为十六进制为0x07。
  • INIT:CRC初始值,和WIDTH位宽一致。
  • REFIN:true或false,在进行计算之前,原始数据是否翻转,如原始数据:0x34 = 0011 0100,如果REFIN为true,进行翻转之后为0010 1100 = 0x2c
  • REFOUT:true或false,运算完成之后,得到的CRC值是否进行翻转,如计算得到的CRC值:0x97 = 1001 0111,如果REFOUT为true,进行翻转之后为11101001 = 0xE9。
  • XOROUT:计算结果与此参数进行异或运算后得到最终的CRC值,和WIDTH位宽一致。

常用的CRC参数模型:
参看:CRC校验原理及实现
在这里插入图片描述
其中常用的几个,主要关注一下用途:
在这里插入图片描述

3、多项式公式

例如:
CRC-16/MODBUS 二项式为 G(X)= X16+X15+X2+1,其中X的指数就代表了该bit位上的数据为1,(最低位为0)。
Poly值0x8005其,省略最高位1,二进制为:1 1000 0000 0000 0101
在这里插入图片描述

4、CRC计算

知识点:

位操作:
参看:C语言再学习 – 位操作

  • 二进制反码或按位取反:~
    需要确认该值是否为unsigned类型,如果是有符号则,正数为原来的数取反、加1
  • &(按位与)(串联)
    只有对应数位上都是1的时候结果才是1
  • |(按位或)(并联)
    只要对应数位中有1则结果就是1
  • ^(按位异或)
    如果对应数位内容一样则结果是0,否则结果为1
  • <<表示向左移动操作
    向左移动是右边空出来的位置上一定补充0
  • ->> 表示向右移动操作
    对于unsigned类型,右移时使用0填充左端空出的位。对于有符号类型,结果依赖于机器。空出的位可能用0填充,或者使用符号(最左端的)位的副本填充。

模2除法求余数:

  • 用除数对被除数最高几位做模2减,没有借位。
  • 除数右移一位,若余数最高位为1,商为1,并对余数做模2减。若余数最高位为0,商为0,除数继续右移一位。
  • 一直做到余数的位数小于除数时,该余数就是最终余数。
  • 其中,模2减法运算为:1-1=0,0-1=1,1-0=1,0-0=0,也无进位,无借位。

例如:
在这里插入图片描述

CRC计算

问:原始数据:0x34,使用CRC-16/Modbus 参数模型,求CRC值?

答:根据CRC参数模型表,得到CRC-16/Modbus的参数如下:

相关代码:

/******************************************************************************* Name:    CRC-16/MODBUS       x16+x15+x2+1* Poly:    0x8005 = 1000 0000 0000 0101* Init:    0xFFFF* Refin:   True* Refout:  True* Xorout:  0x0000* Note:*****************************************************************************/
uint16_t crc16_modbus(uint8_t *data, uint16_t length)
{uint8_t i;uint16_t crc = 0xffff;        // Initial valuewhile(length--){crc ^= *data++;            // crc ^= *data; data++;for (i = 0; i < 8; ++i){if (crc & 1)crc = (crc >> 1) ^ 0xA001;        // 0xA001 = reverse 0x8005elsecrc = (crc >> 1);}}return crc;
}

有了上面的参数,这样计算条件才算完整,下面来实际计算:

  • 1)预置1个16位的寄存器为十六进制FFFF(即全为1),称此寄存器为CRC寄存器;
  • 2)把第一个8位二进制数据(既通讯信息帧的第一个字节)与16位的CRC寄存器的低8位相异或,把结果放于CRC寄存器,高八位数据不变;
  • 3)把CRC寄存器的内容右移一位(朝低位)用0填补最高位,并检查右移后的移出位;
  • 4)、如果移出位为0:重复第3步(再次右移一位);如果移出位为1,CRC寄存器与多项式A001(1010 0000 0000 0001)进行异或;
  • 5)重复步骤3和4,直到右移8次,这样整个8位数据全部进行了处理;
  • 6)重复步骤2到步骤5,进行通讯信息帧下一个字节的处理;
  • 7)将该通讯信息帧所有字节按上述步骤计算完成后,得到的16位CRC寄存器的高、低字节进行交换;
  • 8)最后得到的CRC寄存器内容即为:CRC码。

以上计算步骤中的多项式A001是8005按位颠倒后的结果。

在线计算

CRC(循环冗余校验)在线计算 ,使用时请注意高低位顺序

在这里插入图片描述

使用串口调试工具

在这里插入图片描述
在这里插入图片描述

二、代码实现

常用查表法和计算法。
参看:基于C语言的CRC校验库,包括常用的21个CRC参数模型实现

1、计算法

此方法缺点是计算量大,有时不方便使用在单片机中。

/******************************************************************************* Name:    CRC-4/ITU           x4+x+1* Poly:    0x03* Init:    0x00* Refin:   True* Refout:  True* Xorout:  0x00* Note:*****************************************************************************/
uint8_t crc4_itu(uint8_t *data, uint16_t length)
{uint8_t i;uint8_t crc = 0;                // Initial valuewhile(length--){crc ^= *data++;                 // crc ^= *data; data++;for (i = 0; i < 8; ++i){if (crc & 1)crc = (crc >> 1) ^ 0x0C;// 0x0C = (reverse 0x03)>>(8-4)elsecrc = (crc >> 1);}}return crc;
}/******************************************************************************* Name:    CRC-5/EPC           x5+x3+1* Poly:    0x09* Init:    0x09* Refin:   False* Refout:  False* Xorout:  0x00* Note:*****************************************************************************/
uint8_t crc5_epc(uint8_t *data, uint16_t length)
{uint8_t i;uint8_t crc = 0x48;        // Initial value: 0x48 = 0x09<<(8-5)while(length--){crc ^= *data++;        // crc ^= *data; data++;for ( i = 0; i < 8; i++ ){if ( crc & 0x80 )crc = (crc << 1) ^ 0x48;        // 0x48 = 0x09<<(8-5)elsecrc <<= 1;}}return crc >> 3;
}/******************************************************************************* Name:    CRC-5/ITU           x5+x4+x2+1* Poly:    0x15* Init:    0x00* Refin:   True* Refout:  True* Xorout:  0x00* Note:*****************************************************************************/
uint8_t crc5_itu(uint8_t *data, uint16_t length)
{uint8_t i;uint8_t crc = 0;                // Initial valuewhile(length--){crc ^= *data++;                 // crc ^= *data; data++;for (i = 0; i < 8; ++i){if (crc & 1)crc = (crc >> 1) ^ 0x15;// 0x15 = (reverse 0x15)>>(8-5)elsecrc = (crc >> 1);}}return crc;
}/******************************************************************************* Name:    CRC-5/USB           x5+x2+1* Poly:    0x05* Init:    0x1F* Refin:   True* Refout:  True* Xorout:  0x1F* Note:*****************************************************************************/
uint8_t crc5_usb(uint8_t *data, uint16_t length)
{uint8_t i;uint8_t crc = 0x1F;                // Initial valuewhile(length--){crc ^= *data++;                 // crc ^= *data; data++;for (i = 0; i < 8; ++i){if (crc & 1)crc = (crc >> 1) ^ 0x14;// 0x14 = (reverse 0x05)>>(8-5)elsecrc = (crc >> 1);}}return crc ^ 0x1F;
}/******************************************************************************* Name:    CRC-6/ITU           x6+x+1* Poly:    0x03* Init:    0x00* Refin:   True* Refout:  True* Xorout:  0x00* Note:*****************************************************************************/
uint8_t crc6_itu(uint8_t *data, uint16_t length)
{uint8_t i;uint8_t crc = 0;         // Initial valuewhile(length--){crc ^= *data++;        // crc ^= *data; data++;for (i = 0; i < 8; ++i){if (crc & 1)crc = (crc >> 1) ^ 0x30;// 0x30 = (reverse 0x03)>>(8-6)elsecrc = (crc >> 1);}}return crc;
}/******************************************************************************* Name:    CRC-7/MMC           x7+x3+1* Poly:    0x09* Init:    0x00* Refin:   False* Refout:  False* Xorout:  0x00* Use:     MultiMediaCard,SD,ect.*****************************************************************************/
uint8_t crc7_mmc(uint8_t *data, uint16_t length)
{uint8_t i;uint8_t crc = 0;        // Initial valuewhile(length--){crc ^= *data++;        // crc ^= *data; data++;for ( i = 0; i < 8; i++ ){if ( crc & 0x80 )crc = (crc << 1) ^ 0x12;        // 0x12 = 0x09<<(8-7)elsecrc <<= 1;}}return crc >> 1;
}/******************************************************************************* Name:    CRC-8               x8+x2+x+1* Poly:    0x07* Init:    0x00* Refin:   False* Refout:  False* Xorout:  0x00* Note:*****************************************************************************/
uint8_t crc8(uint8_t *data, uint16_t length)
{uint8_t i;uint8_t crc = 0;        // Initial valuewhile(length--){crc ^= *data++;        // crc ^= *data; data++;for ( i = 0; i < 8; i++ ){if ( crc & 0x80 )crc = (crc << 1) ^ 0x07;elsecrc <<= 1;}}return crc;
}/******************************************************************************* Name:    CRC-8/ITU           x8+x2+x+1* Poly:    0x07* Init:    0x00* Refin:   False* Refout:  False* Xorout:  0x55* Alias:   CRC-8/ATM*****************************************************************************/
uint8_t crc8_itu(uint8_t *data, uint16_t length)
{uint8_t i;uint8_t crc = 0;        // Initial valuewhile(length--){crc ^= *data++;        // crc ^= *data; data++;for ( i = 0; i < 8; i++ ){if ( crc & 0x80 )crc = (crc << 1) ^ 0x07;elsecrc <<= 1;}}return crc ^ 0x55;
}/******************************************************************************* Name:    CRC-8/ROHC          x8+x2+x+1* Poly:    0x07* Init:    0xFF* Refin:   True* Refout:  True* Xorout:  0x00* Note:*****************************************************************************/
uint8_t crc8_rohc(uint8_t *data, uint16_t length)
{uint8_t i;uint8_t crc = 0xFF;         // Initial valuewhile(length--){crc ^= *data++;            // crc ^= *data; data++;for (i = 0; i < 8; ++i){if (crc & 1)crc = (crc >> 1) ^ 0xE0;        // 0xE0 = reverse 0x07elsecrc = (crc >> 1);}}return crc;
}/******************************************************************************* Name:    CRC-8/MAXIM         x8+x5+x4+1* Poly:    0x31* Init:    0x00* Refin:   True* Refout:  True* Xorout:  0x00* Alias:   DOW-CRC,CRC-8/IBUTTON* Use:     Maxim(Dallas)'s some devices,e.g. DS18B20*****************************************************************************/
uint8_t crc8_maxim(uint8_t *data, uint16_t length)
{uint8_t i;uint8_t crc = 0;         // Initial valuewhile(length--){crc ^= *data++;        // crc ^= *data; data++;for (i = 0; i < 8; i++){if (crc & 1)crc = (crc >> 1) ^ 0x8C;        // 0x8C = reverse 0x31elsecrc >>= 1;}}return crc;
}/******************************************************************************* Name:    CRC-16/IBM          x16+x15+x2+1* Poly:    0x8005* Init:    0x0000* Refin:   True* Refout:  True* Xorout:  0x0000* Alias:   CRC-16,CRC-16/ARC,CRC-16/LHA*****************************************************************************/
uint16_t crc16_ibm(uint8_t *data, uint16_t length)
{uint8_t i;uint16_t crc = 0;        // Initial valuewhile(length--){crc ^= *data++;        // crc ^= *data; data++;for (i = 0; i < 8; ++i){if (crc & 1)crc = (crc >> 1) ^ 0xA001;        // 0xA001 = reverse 0x8005elsecrc = (crc >> 1);}}return crc;
}/******************************************************************************* Name:    CRC-16/MAXIM        x16+x15+x2+1* Poly:    0x8005* Init:    0x0000* Refin:   True* Refout:  True* Xorout:  0xFFFF* Note:*****************************************************************************/
uint16_t crc16_maxim(uint8_t *data, uint16_t length)
{uint8_t i;uint16_t crc = 0;        // Initial valuewhile(length--){crc ^= *data++;        // crc ^= *data; data++;for (i = 0; i < 8; ++i){if (crc & 1)crc = (crc >> 1) ^ 0xA001;        // 0xA001 = reverse 0x8005elsecrc = (crc >> 1);}}return ~crc;    // crc^0xffff
}/******************************************************************************* Name:    CRC-16/USB          x16+x15+x2+1* Poly:    0x8005* Init:    0xFFFF* Refin:   True* Refout:  True* Xorout:  0xFFFF* Note:*****************************************************************************/
uint16_t crc16_usb(uint8_t *data, uint16_t length)
{uint8_t i;uint16_t crc = 0xffff;        // Initial valuewhile(length--){crc ^= *data++;            // crc ^= *data; data++;for (i = 0; i < 8; ++i){if (crc & 1)crc = (crc >> 1) ^ 0xA001;        // 0xA001 = reverse 0x8005elsecrc = (crc >> 1);}}return ~crc;    // crc^0xffff
}/******************************************************************************* Name:    CRC-16/MODBUS       x16+x15+x2+1* Poly:    0x8005* Init:    0xFFFF* Refin:   True* Refout:  True* Xorout:  0x0000* Note:*****************************************************************************/
uint16_t crc16_modbus(uint8_t *data, uint16_t length)
{uint8_t i;uint16_t crc = 0xffff;        // Initial valuewhile(length--){crc ^= *data++;            // crc ^= *data; data++;for (i = 0; i < 8; ++i){if (crc & 1)crc = (crc >> 1) ^ 0xA001;        // 0xA001 = reverse 0x8005elsecrc = (crc >> 1);}}return crc;
}/******************************************************************************* Name:    CRC-16/CCITT        x16+x12+x5+1* Poly:    0x1021* Init:    0x0000* Refin:   True* Refout:  True* Xorout:  0x0000* Alias:   CRC-CCITT,CRC-16/CCITT-TRUE,CRC-16/KERMIT*****************************************************************************/
uint16_t crc16_ccitt(uint8_t *data, uint16_t length)
{uint8_t i;uint16_t crc = 0;        // Initial valuewhile(length--){crc ^= *data++;        // crc ^= *data; data++;for (i = 0; i < 8; ++i){if (crc & 1)crc = (crc >> 1) ^ 0x8408;        // 0x8408 = reverse 0x1021elsecrc = (crc >> 1);}}return crc;
}/******************************************************************************* Name:    CRC-16/CCITT-FALSE   x16+x12+x5+1* Poly:    0x1021* Init:    0xFFFF* Refin:   False* Refout:  False* Xorout:  0x0000* Note:*****************************************************************************/
uint16_t crc16_ccitt_false(uint8_t *data, uint16_t length)
{uint8_t i;uint16_t crc = 0xffff;        //Initial valuewhile(length--){crc ^= (uint16_t)(*data++) << 8; // crc ^= (uint6_t)(*data)<<8; data++;for (i = 0; i < 8; ++i){if ( crc & 0x8000 )crc = (crc << 1) ^ 0x1021;elsecrc <<= 1;}}return crc;
}/******************************************************************************* Name:    CRC-16/X25          x16+x12+x5+1* Poly:    0x1021* Init:    0xFFFF* Refin:   True* Refout:  True* Xorout:  0XFFFF* Note:*****************************************************************************/
uint16_t crc16_x25(uint8_t *data, uint16_t length)
{uint8_t i;uint16_t crc = 0xffff;        // Initial valuewhile(length--){crc ^= *data++;            // crc ^= *data; data++;for (i = 0; i < 8; ++i){if (crc & 1)crc = (crc >> 1) ^ 0x8408;        // 0x8408 = reverse 0x1021elsecrc = (crc >> 1);}}return ~crc;                // crc^Xorout
}/******************************************************************************* Name:    CRC-16/XMODEM       x16+x12+x5+1* Poly:    0x1021* Init:    0x0000* Refin:   False* Refout:  False* Xorout:  0x0000* Alias:   CRC-16/ZMODEM,CRC-16/ACORN*****************************************************************************/
uint16_t crc16_xmodem(uint8_t *data, uint16_t length)
{uint8_t i;uint16_t crc = 0;            // Initial valuewhile(length--){crc ^= (uint16_t)(*data++) << 8; // crc ^= (uint16_t)(*data)<<8; data++;for (i = 0; i < 8; ++i){if ( crc & 0x8000 )crc = (crc << 1) ^ 0x1021;elsecrc <<= 1;}}return crc;
}/******************************************************************************* Name:    CRC-16/DNP          x16+x13+x12+x11+x10+x8+x6+x5+x2+1* Poly:    0x3D65* Init:    0x0000* Refin:   True* Refout:  True* Xorout:  0xFFFF* Use:     M-Bus,ect.*****************************************************************************/
uint16_t crc16_dnp(uint8_t *data, uint16_t length)
{uint8_t i;uint16_t crc = 0;            // Initial valuewhile(length--){crc ^= *data++;            // crc ^= *data; data++;for (i = 0; i < 8; ++i){if (crc & 1)crc = (crc >> 1) ^ 0xA6BC;        // 0xA6BC = reverse 0x3D65elsecrc = (crc >> 1);}}return ~crc;                // crc^Xorout
}/******************************************************************************* Name:    CRC-32  x32+x26+x23+x22+x16+x12+x11+x10+x8+x7+x5+x4+x2+x+1* Poly:    0x4C11DB7* Init:    0xFFFFFFF* Refin:   True* Refout:  True* Xorout:  0xFFFFFFF* Alias:   CRC_32/ADCCP* Use:     WinRAR,ect.*****************************************************************************/
uint32_t crc32(uint8_t *data, uint16_t length)
{uint8_t i;uint32_t crc = 0xffffffff;        // Initial valuewhile(length--){crc ^= *data++;                // crc ^= *data; data++;for (i = 0; i < 8; ++i){if (crc & 1)crc = (crc >> 1) ^ 0xEDB88320;// 0xEDB88320= reverse 0x04C11DB7elsecrc = (crc >> 1);}}return ~crc;
}/******************************************************************************* Name:    CRC-32/MPEG-2  x32+x26+x23+x22+x16+x12+x11+x10+x8+x7+x5+x4+x2+x+1* Poly:    0x4C11DB7* Init:    0xFFFFFFF* Refin:   False* Refout:  False* Xorout:  0x0000000* Note:*****************************************************************************/
uint32_t crc32_mpeg_2(uint8_t *data, uint16_t length)
{uint8_t i;uint32_t crc = 0xffffffff;  // Initial valuewhile(length--){crc ^= (uint32_t)(*data++) << 24;// crc ^=(uint32_t)(*data)<<24; data++;for (i = 0; i < 8; ++i){if ( crc & 0x80000000 )crc = (crc << 1) ^ 0x04C11DB7;elsecrc <<= 1;}}return crc;
}

2、查表法

速度快,语句少,但表格占用一定的程序空间。

CRC表:

const unsigned short CRC16CCITTtab[256] = {
#if defined ( XCP_ENABLE_CRC16CCITT_REFLECTED )0x0000,0x1189,0x2312,0x329B,0x4624,0x57AD,0x6536,0x74BF,0x8C48,0x9DC1,0xAF5A,0xBED3,0xCA6C,0xDBE5,0xE97E,0xF8F7,0x1081,0x0108,0x3393,0x221A,0x56A5,0x472C,0x75B7,0x643E,0x9CC9,0x8D40,0xBFDB,0xAE52,0xDAED,0xCB64,0xF9FF,0xE876,0x2102,0x308B,0x0210,0x1399,0x6726,0x76AF,0x4434,0x55BD,0xAD4A,0xBCC3,0x8E58,0x9FD1,0xEB6E,0xFAE7,0xC87C,0xD9F5,0x3183,0x200A,0x1291,0x0318,0x77A7,0x662E,0x54B5,0x453C,0xBDCB,0xAC42,0x9ED9,0x8F50,0xFBEF,0xEA66,0xD8FD,0xC974,0x4204,0x538D,0x6116,0x709F,0x0420,0x15A9,0x2732,0x36BB,0xCE4C,0xDFC5,0xED5E,0xFCD7,0x8868,0x99E1,0xAB7A,0xBAF3,0x5285,0x430C,0x7197,0x601E,0x14A1,0x0528,0x37B3,0x263A,0xDECD,0xCF44,0xFDDF,0xEC56,0x98E9,0x8960,0xBBFB,0xAA72,0x6306,0x728F,0x4014,0x519D,0x2522,0x34AB,0x0630,0x17B9,0xEF4E,0xFEC7,0xCC5C,0xDDD5,0xA96A,0xB8E3,0x8A78,0x9BF1,0x7387,0x620E,0x5095,0x411C,0x35A3,0x242A,0x16B1,0x0738,0xFFCF,0xEE46,0xDCDD,0xCD54,0xB9EB,0xA862,0x9AF9,0x8B70,0x8408,0x9581,0xA71A,0xB693,0xC22C,0xD3A5,0xE13E,0xF0B7,0x0840,0x19C9,0x2B52,0x3ADB,0x4E64,0x5FED,0x6D76,0x7CFF,0x9489,0x8500,0xB79B,0xA612,0xD2AD,0xC324,0xF1BF,0xE036,0x18C1,0x0948,0x3BD3,0x2A5A,0x5EE5,0x4F6C,0x7DF7,0x6C7E,0xA50A,0xB483,0x8618,0x9791,0xE32E,0xF2A7,0xC03C,0xD1B5,0x2942,0x38CB,0x0A50,0x1BD9,0x6F66,0x7EEF,0x4C74,0x5DFD,0xB58B,0xA402,0x9699,0x8710,0xF3AF,0xE226,0xD0BD,0xC134,0x39C3,0x284A,0x1AD1,0x0B58,0x7FE7,0x6E6E,0x5CF5,0x4D7C,0xC60C,0xD785,0xE51E,0xF497,0x8028,0x91A1,0xA33A,0xB2B3,0x4A44,0x5BCD,0x6956,0x78DF,0x0C60,0x1DE9,0x2F72,0x3EFB,0xD68D,0xC704,0xF59F,0xE416,0x90A9,0x8120,0xB3BB,0xA232,0x5AC5,0x4B4C,0x79D7,0x685E,0x1CE1,0x0D68,0x3FF3,0x2E7A,0xE70E,0xF687,0xC41C,0xD595,0xA12A,0xB0A3,0x8238,0x93B1,0x6B46,0x7ACF,0x4854,0x59DD,0x2D62,0x3CEB,0x0E70,0x1FF9,0xF78F,0xE606,0xD49D,0xC514,0xB1AB,0xA022,0x92B9,0x8330,0x7BC7,0x6A4E,0x58D5,0x495C,0x3DE3,0x2C6A,0x1EF1,0x0F78
#else0x0000,0x1021,0x2042,0x3063,0x4084,0x50a5,0x60c6,0x70e7u,0x8108,0x9129,0xa14a,0xb16b,0xc18c,0xd1ad,0xe1ce,0xf1efu,0x1231,0x0210,0x3273,0x2252,0x52b5,0x4294,0x72f7,0x62d6u,0x9339,0x8318,0xb37b,0xa35a,0xd3bd,0xc39c,0xf3ff,0xe3deu,0x2462,0x3443,0x0420,0x1401,0x64e6,0x74c7,0x44a4,0x5485u,0xa56a,0xb54b,0x8528,0x9509,0xe5ee,0xf5cf,0xc5ac,0xd58du,0x3653,0x2672,0x1611,0x0630,0x76d7,0x66f6,0x5695,0x46b4u,0xb75b,0xa77a,0x9719,0x8738,0xf7df,0xe7fe,0xd79d,0xc7bcu,0x48c4,0x58e5,0x6886,0x78a7,0x0840,0x1861,0x2802,0x3823u,0xc9cc,0xd9ed,0xe98e,0xf9af,0x8948,0x9969,0xa90a,0xb92bu,0x5af5,0x4ad4,0x7ab7,0x6a96,0x1a71,0x0a50,0x3a33,0x2a12u,0xdbfd,0xcbdc,0xfbbf,0xeb9e,0x9b79,0x8b58,0xbb3b,0xab1au,0x6ca6,0x7c87,0x4ce4,0x5cc5,0x2c22,0x3c03,0x0c60,0x1c41u,0xedae,0xfd8f,0xcdec,0xddcd,0xad2a,0xbd0b,0x8d68,0x9d49u,0x7e97,0x6eb6,0x5ed5,0x4ef4,0x3e13,0x2e32,0x1e51,0x0e70u,0xff9f,0xefbe,0xdfdd,0xcffc,0xbf1b,0xaf3a,0x9f59,0x8f78u,0x9188,0x81a9,0xb1ca,0xa1eb,0xd10c,0xc12d,0xf14e,0xe16fu,0x1080,0x00a1,0x30c2,0x20e3,0x5004,0x4025,0x7046,0x6067u,0x83b9,0x9398,0xa3fb,0xb3da,0xc33d,0xd31c,0xe37f,0xf35eu,0x02b1,0x1290,0x22f3,0x32d2,0x4235,0x5214,0x6277,0x7256u,0xb5ea,0xa5cb,0x95a8,0x8589,0xf56e,0xe54f,0xd52c,0xc50du,0x34e2,0x24c3,0x14a0,0x0481,0x7466,0x6447,0x5424,0x4405u,0xa7db,0xb7fa,0x8799,0x97b8,0xe75f,0xf77e,0xc71d,0xd73cu,0x26d3,0x36f2,0x0691,0x16b0,0x6657,0x7676,0x4615,0x5634u,0xd94c,0xc96d,0xf90e,0xe92f,0x99c8,0x89e9,0xb98a,0xa9abu,0x5844,0x4865,0x7806,0x6827,0x18c0,0x08e1,0x3882,0x28a3u,0xcb7d,0xdb5c,0xeb3f,0xfb1e,0x8bf9,0x9bd8,0xabbb,0xbb9au,0x4a75,0x5a54,0x6a37,0x7a16,0x0af1,0x1ad0,0x2ab3,0x3a92u,0xfd2e,0xed0f,0xdd6c,0xcd4d,0xbdaa,0xad8b,0x9de8,0x8dc9u,0x7c26,0x6c07,0x5c64,0x4c45,0x3ca2,0x2c83,0x1ce0,0x0cc1u,0xef1f,0xff3e,0xcf5d,0xdf7c,0xaf9b,0xbfba,0x8fd9,0x9ff8u,0x6e17,0x7e36,0x4e55,0x5e74,0x2e93,0x3eb2,0x0ed1,0x1ef0u
#endif /* defined ( XCP_ENABLE_CRC16CCITT_REFLECTED ) */};/* Table for 32-Bit CRC */
const unsigned int crc32Table[256] =
{0x00000000uL, 0x77073096uL, 0xEE0E612CuL, 0x990951BAuL,0x076DC419uL, 0x706AF48FuL, 0xE963A535uL, 0x9E6495A3uL,0x0EDB8832uL, 0x79DCB8A4uL, 0xE0D5E91EuL, 0x97D2D988uL,0x09B64C2BuL, 0x7EB17CBDuL, 0xE7B82D07uL, 0x90BF1D91uL,0x1DB71064uL, 0x6AB020F2uL, 0xF3B97148uL, 0x84BE41DEuL,0x1ADAD47DuL, 0x6DDDE4EBuL, 0xF4D4B551uL, 0x83D385C7uL,0x136C9856uL, 0x646BA8C0uL, 0xFD62F97AuL, 0x8A65C9ECuL,0x14015C4FuL, 0x63066CD9uL, 0xFA0F3D63uL, 0x8D080DF5uL,0x3B6E20C8uL, 0x4C69105EuL, 0xD56041E4uL, 0xA2677172uL,0x3C03E4D1uL, 0x4B04D447uL, 0xD20D85FDuL, 0xA50AB56BuL,0x35B5A8FAuL, 0x42B2986CuL, 0xDBBBC9D6uL, 0xACBCF940uL,0x32D86CE3uL, 0x45DF5C75uL, 0xDCD60DCFuL, 0xABD13D59uL,0x26D930ACuL, 0x51DE003AuL, 0xC8D75180uL, 0xBFD06116uL,0x21B4F4B5uL, 0x56B3C423uL, 0xCFBA9599uL, 0xB8BDA50FuL,0x2802B89EuL, 0x5F058808uL, 0xC60CD9B2uL, 0xB10BE924uL,0x2F6F7C87uL, 0x58684C11uL, 0xC1611DABuL, 0xB6662D3DuL,0x76DC4190uL, 0x01DB7106uL, 0x98D220BCuL, 0xEFD5102AuL,0x71B18589uL, 0x06B6B51FuL, 0x9FBFE4A5uL, 0xE8B8D433uL,0x7807C9A2uL, 0x0F00F934uL, 0x9609A88EuL, 0xE10E9818uL,0x7F6A0DBBuL, 0x086D3D2DuL, 0x91646C97uL, 0xE6635C01uL,0x6B6B51F4uL, 0x1C6C6162uL, 0x856530D8uL, 0xF262004EuL,0x6C0695EDuL, 0x1B01A57BuL, 0x8208F4C1uL, 0xF50FC457uL,0x65B0D9C6uL, 0x12B7E950uL, 0x8BBEB8EAuL, 0xFCB9887CuL,0x62DD1DDFuL, 0x15DA2D49uL, 0x8CD37CF3uL, 0xFBD44C65uL,0x4DB26158uL, 0x3AB551CEuL, 0xA3BC0074uL, 0xD4BB30E2uL,0x4ADFA541uL, 0x3DD895D7uL, 0xA4D1C46DuL, 0xD3D6F4FBuL,0x4369E96AuL, 0x346ED9FCuL, 0xAD678846uL, 0xDA60B8D0uL,0x44042D73uL, 0x33031DE5uL, 0xAA0A4C5FuL, 0xDD0D7CC9uL,0x5005713CuL, 0x270241AAuL, 0xBE0B1010uL, 0xC90C2086uL,0x5768B525uL, 0x206F85B3uL, 0xB966D409uL, 0xCE61E49FuL,0x5EDEF90EuL, 0x29D9C998uL, 0xB0D09822uL, 0xC7D7A8B4uL,0x59B33D17uL, 0x2EB40D81uL, 0xB7BD5C3BuL, 0xC0BA6CADuL,0xEDB88320uL, 0x9ABFB3B6uL, 0x03B6E20CuL, 0x74B1D29AuL,0xEAD54739uL, 0x9DD277AFuL, 0x04DB2615uL, 0x73DC1683uL,0xE3630B12uL, 0x94643B84uL, 0x0D6D6A3EuL, 0x7A6A5AA8uL,0xE40ECF0BuL, 0x9309FF9DuL, 0x0A00AE27uL, 0x7D079EB1uL,0xF00F9344uL, 0x8708A3D2uL, 0x1E01F268uL, 0x6906C2FEuL,0xF762575DuL, 0x806567CBuL, 0x196C3671uL, 0x6E6B06E7uL,0xFED41B76uL, 0x89D32BE0uL, 0x10DA7A5AuL, 0x67DD4ACCuL,0xF9B9DF6FuL, 0x8EBEEFF9uL, 0x17B7BE43uL, 0x60B08ED5uL,0xD6D6A3E8uL, 0xA1D1937EuL, 0x38D8C2C4uL, 0x4FDFF252uL,0xD1BB67F1uL, 0xA6BC5767uL, 0x3FB506DDuL, 0x48B2364BuL,0xD80D2BDAuL, 0xAF0A1B4CuL, 0x36034AF6uL, 0x41047A60uL,0xDF60EFC3uL, 0xA867DF55uL, 0x316E8EEFuL, 0x4669BE79uL,0xCB61B38CuL, 0xBC66831AuL, 0x256FD2A0uL, 0x5268E236uL,0xCC0C7795uL, 0xBB0B4703uL, 0x220216B9uL, 0x5505262FuL,0xC5BA3BBEuL, 0xB2BD0B28uL, 0x2BB45A92uL, 0x5CB36A04uL,0xC2D7FFA7uL, 0xB5D0CF31uL, 0x2CD99E8BuL, 0x5BDEAE1DuL,0x9B64C2B0uL, 0xEC63F226uL, 0x756AA39CuL, 0x026D930AuL,0x9C0906A9uL, 0xEB0E363FuL, 0x72076785uL, 0x05005713uL,0x95BF4A82uL, 0xE2B87A14uL, 0x7BB12BAEuL, 0x0CB61B38uL,0x92D28E9BuL, 0xE5D5BE0DuL, 0x7CDCEFB7uL, 0x0BDBDF21uL,0x86D3D2D4uL, 0xF1D4E242uL, 0x68DDB3F8uL, 0x1FDA836EuL,0x81BE16CDuL, 0xF6B9265BuL, 0x6FB077E1uL, 0x18B74777uL,0x88085AE6uL, 0xFF0F6A70uL, 0x66063BCAuL, 0x11010B5CuL,0x8F659EFFuL, 0xF862AE69uL, 0x616BFFD3uL, 0x166CCF45uL,0xA00AE278uL, 0xD70DD2EEuL, 0x4E048354uL, 0x3903B3C2uL,0xA7672661uL, 0xD06016F7uL, 0x4969474DuL, 0x3E6E77DBuL,0xAED16A4AuL, 0xD9D65ADCuL, 0x40DF0B66uL, 0x37D83BF0uL,0xA9BCAE53uL, 0xDEBB9EC5uL, 0x47B2CF7FuL, 0x30B5FFE9uL,0xBDBDF21CuL, 0xCABAC28AuL, 0x53B39330uL, 0x24B4A3A6uL,0xBAD03605uL, 0xCDD70693uL, 0x54DE5729uL, 0x23D967BFuL,0xB3667A2EuL, 0xC4614AB8uL, 0x5D681B02uL, 0x2A6F2B94uL,0xB40BBE37uL, 0xC30C8EA1uL, 0x5A05DF1BuL, 0x2D02EF8DuL
};/* Table for 16-Bit CRC */
const unsigned short crc16Table[256] = /* CRC lookup table */
{0x0000u, 0xC0C1u, 0xC181u, 0x0140u, 0xC301u, 0x03C0u, 0x0280u, 0xC241u,0xC601u, 0x06C0u, 0x0780u, 0xC741u, 0x0500u, 0xC5C1u, 0xC481u, 0x0440u,0xCC01u, 0x0CC0u, 0x0D80u, 0xCD41u, 0x0F00u, 0xCFC1u, 0xCE81u, 0x0E40u,0x0A00u, 0xCAC1u, 0xCB81u, 0x0B40u, 0xC901u, 0x09C0u, 0x0880u, 0xC841u,0xD801u, 0x18C0u, 0x1980u, 0xD941u, 0x1B00u, 0xDBC1u, 0xDA81u, 0x1A40u,0x1E00u, 0xDEC1u, 0xDF81u, 0x1F40u, 0xDD01u, 0x1DC0u, 0x1C80u, 0xDC41u,0x1400u, 0xD4C1u, 0xD581u, 0x1540u, 0xD701u, 0x17C0u, 0x1680u, 0xD641u,0xD201u, 0x12C0u, 0x1380u, 0xD341u, 0x1100u, 0xD1C1u, 0xD081u, 0x1040u,0xF001u, 0x30C0u, 0x3180u, 0xF141u, 0x3300u, 0xF3C1u, 0xF281u, 0x3240u,0x3600u, 0xF6C1u, 0xF781u, 0x3740u, 0xF501u, 0x35C0u, 0x3480u, 0xF441u,0x3C00u, 0xFCC1u, 0xFD81u, 0x3D40u, 0xFF01u, 0x3FC0u, 0x3E80u, 0xFE41u,0xFA01u, 0x3AC0u, 0x3B80u, 0xFB41u, 0x3900u, 0xF9C1u, 0xF881u, 0x3840u,0x2800u, 0xE8C1u, 0xE981u, 0x2940u, 0xEB01u, 0x2BC0u, 0x2A80u, 0xEA41u,0xEE01u, 0x2EC0u, 0x2F80u, 0xEF41u, 0x2D00u, 0xEDC1u, 0xEC81u, 0x2C40u,0xE401u, 0x24C0u, 0x2580u, 0xE541u, 0x2700u, 0xE7C1u, 0xE681u, 0x2640u,0x2200u, 0xE2C1u, 0xE381u, 0x2340u, 0xE101u, 0x21C0u, 0x2080u, 0xE041u,0xA001u, 0x60C0u, 0x6180u, 0xA141u, 0x6300u, 0xA3C1u, 0xA281u, 0x6240u,0x6600u, 0xA6C1u, 0xA781u, 0x6740u, 0xA501u, 0x65C0u, 0x6480u, 0xA441u,0x6C00u, 0xACC1u, 0xAD81u, 0x6D40u, 0xAF01u, 0x6FC0u, 0x6E80u, 0xAE41u,0xAA01u, 0x6AC0u, 0x6B80u, 0xAB41u, 0x6900u, 0xA9C1u, 0xA881u, 0x6840u,0x7800u, 0xB8C1u, 0xB981u, 0x7940u, 0xBB01u, 0x7BC0u, 0x7A80u, 0xBA41u,0xBE01u, 0x7EC0u, 0x7F80u, 0xBF41u, 0x7D00u, 0xBDC1u, 0xBC81u, 0x7C40u,0xB401u, 0x74C0u, 0x7580u, 0xB541u, 0x7700u, 0xB7C1u, 0xB681u, 0x7640u,0x7200u, 0xB2C1u, 0xB381u, 0x7340u, 0xB101u, 0x71C0u, 0x7080u, 0xB041u,0x5000u, 0x90C1u, 0x9181u, 0x5140u, 0x9301u, 0x53C0u, 0x5280u, 0x9241u,0x9601u, 0x56C0u, 0x5780u, 0x9741u, 0x5500u, 0x95C1u, 0x9481u, 0x5440u,0x9C01u, 0x5CC0u, 0x5D80u, 0x9D41u, 0x5F00u, 0x9FC1u, 0x9E81u, 0x5E40u,0x5A00u, 0x9AC1u, 0x9B81u, 0x5B40u, 0x9901u, 0x59C0u, 0x5880u, 0x9841u,0x8801u, 0x48C0u, 0x4980u, 0x8941u, 0x4B00u, 0x8BC1u, 0x8A81u, 0x4A40u,0x4E00u, 0x8EC1u, 0x8F81u, 0x4F40u, 0x8D01u, 0x4DC0u, 0x4C80u, 0x8C41u,0x4400u, 0x84C1u, 0x8581u, 0x4540u, 0x8701u, 0x47C0u, 0x4680u, 0x8641u,0x8201u, 0x42C0u, 0x4380u, 0x8341u, 0x4100u, 0x81C1u, 0x8081u, 0x4040u
};/* Table for 16-Bit CCITT X.25 CRC */
const int gCrc16X25Table[256] = /* CRC lookup table */
{0x0000,   0x1021,  0x2042,  0x3063,  0x4084,  0x50a5,  0x60c6,  0x70e7,0x8108,   0x9129,  0xa14a,  0xb16b,  0xc18c,  0xd1ad,  0xe1ce,  0xf1ef,0x11231, 0x10210, 0x13273, 0x12252, 0x152b5, 0x14294, 0x172f7, 0x162d6,0x19339, 0x18318, 0x1b37b, 0x1a35a, 0x1d3bd, 0x1c39c, 0x1f3ff, 0x1e3de,0x22462, 0x23443, 0x20420, 0x21401, 0x264e6, 0x274c7, 0x244a4, 0x25485,0x2a56a, 0x2b54b, 0x28528, 0x29509, 0x2e5ee, 0x2f5cf, 0x2c5ac, 0x2d58d,0x33653, 0x32672, 0x31611, 0x30630, 0x376d7, 0x366f6, 0x35695, 0x346b4,0x3b75b, 0x3a77a, 0x39719, 0x38738, 0x3f7df, 0x3e7fe, 0x3d79d, 0x3c7bc,0x448c4, 0x458e5, 0x46886, 0x478a7, 0x40840, 0x41861, 0x42802, 0x43823,0x4c9cc, 0x4d9ed, 0x4e98e, 0x4f9af, 0x48948, 0x49969, 0x4a90a, 0x4b92b,0x55af5, 0x54ad4, 0x57ab7, 0x56a96, 0x51a71, 0x50a50, 0x53a33, 0x52a12,0x5dbfd, 0x5cbdc, 0x5fbbf, 0x5eb9e, 0x59b79, 0x58b58, 0x5bb3b, 0x5ab1a,0x66ca6, 0x67c87, 0x64ce4, 0x65cc5, 0x62c22, 0x63c03, 0x60c60, 0x61c41,0x6edae, 0x6fd8f, 0x6cdec, 0x6ddcd, 0x6ad2a, 0x6bd0b, 0x68d68, 0x69d49,0x77e97, 0x76eb6, 0x75ed5, 0x74ef4, 0x73e13, 0x72e32, 0x71e51, 0x70e70,0x7ff9f, 0x7efbe, 0x7dfdd, 0x7cffc, 0x7bf1b, 0x7af3a, 0x79f59, 0x78f78,0x89188, 0x881a9, 0x8b1ca, 0x8a1eb, 0x8d10c, 0x8c12d, 0x8f14e, 0x8e16f,0x81080, 0x800a1, 0x830c2, 0x820e3, 0x85004, 0x84025, 0x87046, 0x86067,0x983b9, 0x99398, 0x9a3fb, 0x9b3da, 0x9c33d, 0x9d31c, 0x9e37f, 0x9f35e,0x902b1, 0x91290, 0x922f3, 0x932d2, 0x94235, 0x95214, 0x96277, 0x97256,0xab5ea, 0xaa5cb, 0xa95a8, 0xa8589, 0xaf56e, 0xae54f, 0xad52c, 0xac50d,0xa34e2, 0xa24c3, 0xa14a0, 0xa0481, 0xa7466, 0xa6447, 0xa5424, 0xa4405,0xba7db, 0xbb7fa, 0xb8799, 0xb97b8, 0xbe75f, 0xbf77e, 0xbc71d, 0xbd73c,0xb26d3, 0xb36f2, 0xb0691, 0xb16b0, 0xb6657, 0xb7676, 0xb4615, 0xb5634,0xcd94c, 0xcc96d, 0xcf90e, 0xce92f, 0xc99c8, 0xc89e9, 0xcb98a, 0xca9ab,0xc5844, 0xc4865, 0xc7806, 0xc6827, 0xc18c0, 0xc08e1, 0xc3882, 0xc28a3,0xdcb7d, 0xddb5c, 0xdeb3f, 0xdfb1e, 0xd8bf9, 0xd9bd8, 0xdabbb, 0xdbb9a,0xd4a75, 0xd5a54, 0xd6a37, 0xd7a16, 0xd0af1, 0xd1ad0, 0xd2ab3, 0xd3a92,0xefd2e, 0xeed0f, 0xedd6c, 0xecd4d, 0xebdaa, 0xead8b, 0xe9de8, 0xe8dc9,0xe7c26, 0xe6c07, 0xe5c64, 0xe4c45, 0xe3ca2, 0xe2c83, 0xe1ce0, 0xe0cc1,0xfef1f, 0xfff3e, 0xfcf5d, 0xfdf7c, 0xfaf9b, 0xfbfba, 0xf8fd9, 0xf9ff8,0xf6e17, 0xf7e36, 0xf4e55, 0xf5e74, 0xf2e93, 0xf3eb2, 0xf0ed1, 0xf1ef0
};/* Specific X25 table from PREH */
const unsigned short kausCrcTable16_cafe[256] = {0x0000u, 0x1021u, 0x2042u, 0x3063u, 0x4084u, 0x50a5u, 0x60c6u, 0x70e7u,  0x8108u, 0x9129u, 0xa14au, 0xb16bu, 0xc18cu, 0xd1adu, 0xe1ceu, 0xf1efu,0x1231u, 0x0210u, 0x3273u, 0x2252u, 0x52b5u, 0x4294u, 0x72f7u, 0x62d6u,  0x9339u, 0x8318u, 0xb37bu, 0xa35au, 0xd3bdu, 0xc39cu, 0xf3ffu, 0xe3deu,0x2462u, 0x3443u, 0x0420u, 0x1401u, 0x64e6u, 0x74c7u, 0x44a4u, 0x5485u,  0xa56au, 0xb54bu, 0x8528u, 0x9509u, 0xe5eeu, 0xf5cfu, 0xc5acu, 0xd58du,0x3653u, 0x2672u, 0x1611u, 0x0630u, 0x76d7u, 0x66f6u, 0x5695u, 0x46b4u,  0xb75bu, 0xa77au, 0x9719u, 0x8738u, 0xf7dfu, 0xe7feu, 0xd79du, 0xc7bcu,0x48c4u, 0x58e5u, 0x6886u, 0x78a7u, 0x0840u, 0x1861u, 0x2802u, 0x3823u,  0xc9ccu, 0xd9edu, 0xe98eu, 0xf9afu, 0x8948u, 0x9969u, 0xa90au, 0xb92bu,0x5af5u, 0x4ad4u, 0x7ab7u, 0x6a96u, 0x1a71u, 0x0a50u, 0x3a33u, 0x2a12u,  0xdbfdu, 0xcbdcu, 0xfbbfu, 0xeb9eu, 0x9b79u, 0x8b58u, 0xbb3bu, 0xab1au,0x6ca6u, 0x7c87u, 0x4ce4u, 0x5cc5u, 0x2c22u, 0x3c03u, 0x0c60u, 0x1c41u,  0xedaeu, 0xfd8fu, 0xcdecu, 0xddcdu, 0xad2au, 0xbd0bu, 0x8d68u, 0x9d49u,0x7e97u, 0x6eb6u, 0x5ed5u, 0x4ef4u, 0x3e13u, 0x2e32u, 0x1e51u, 0x0e70u,  0xff9fu, 0xefbeu, 0xdfddu, 0xcffcu, 0xbf1bu, 0xaf3au, 0x9f59u, 0x8f78u,0x9188u, 0x81a9u, 0xb1cau, 0xa1ebu, 0xd10cu, 0xc12du, 0xf14eu, 0xe16fu,  0x1080u, 0x00a1u, 0x30c2u, 0x20e3u, 0x5004u, 0x4025u, 0x7046u, 0x6067u,0x83b9u, 0x9398u, 0xa3fbu, 0xb3dau, 0xc33du, 0xd31cu, 0xe37fu, 0xf35eu,  0x02b1u, 0x1290u, 0x22f3u, 0x32d2u, 0x4235u, 0x5214u, 0x6277u, 0x7256u,0xb5eau, 0xa5cbu, 0x95a8u, 0x8589u, 0xf56eu, 0xe54fu, 0xd52cu, 0xc50du,  0x34e2u, 0x24c3u, 0x14a0u, 0x0481u, 0x7466u, 0x6447u, 0x5424u, 0x4405u,0xa7dbu, 0xb7fau, 0x8799u, 0x97b8u, 0xe75fu, 0xf77eu, 0xc71du, 0xd73cu,  0x26d3u, 0x36f2u, 0x0691u, 0x16b0u, 0x6657u, 0x7676u, 0x4615u, 0x5634u,0xd94cu, 0xc96du, 0xf90eu, 0xe92fu, 0x99c8u, 0x89e9u, 0xb98au, 0xa9abu,  0x5844u, 0x4865u, 0x7806u, 0x6827u, 0x18c0u, 0x08e1u, 0x3882u, 0x28a3u,0xcb7du, 0xdb5cu, 0xeb3fu, 0xfb1eu, 0x8bf9u, 0x9bd8u, 0xabbbu, 0xbb9au,  0x4a75u, 0x5a54u, 0x6a37u, 0x7a16u, 0x0af1u, 0x1ad0u, 0x2ab3u, 0x3a92u,0xfd2eu, 0xed0fu, 0xdd6cu, 0xcd4du, 0xbdaau, 0xad8bu, 0x9de8u, 0x8dc9u,  0x7c26u, 0x6c07u, 0x5c64u, 0x4c45u, 0x3ca2u, 0x2c83u, 0x1ce0u, 0x0cc1u,0xef1fu, 0xff3eu, 0xcf5du, 0xdf7cu, 0xaf9bu, 0xbfbau, 0x8fd9u, 0x9ff8u,  0x6e17u, 0x7e36u, 0x4e55u, 0x5e74u, 0x2e93u, 0x3eb2u, 0x0ed1u, 0x1ef0u
};

计算:

例如:
CRC16_CCITT 查表计算

unsigned short CRC16_CCITT(unsigned char *puchMsg, int usDataLen)
{int i = 0; unsigned short crc = 0;for (i = 0; i < usDataLen; i++)crc = CRC16CCITTtab[((crc >> 8) ^ puchMsg[i]) & 0xFF] ^ (crc << 8);return crc;
}

CRC32 查表计算 :

unsigned int _getCRC32(void *buffer, unsigned int bufferLen)
{unsigned int crc32Value = 0xffffffff;unsigned char *pTmpBuffer = buffer;while(bufferLen--){crc32Value = crc32Table[(crc32Value^ *pTmpBuffer++) & 0xff] ^ (crc32Value >> 8);}return (crc32Value^0xffffffff);
}

3、交换高低位

CRC_Value = ((CRC_Value >> 8) +  (CRC_Value << 8)); //交换高低字节

4、生成所有可能字节的CRC余数表

/* 这个版本的包使用的生成器多项式是*/
/ * x ^ 32 + x x ^ ^ 26 + 23 + 22 + x ^ ^ 16 + x ^ 12 + x ^ 11 + x x ^ ^ 10 + 8 + x ^ 7 + x x ^ ^ 5 + 4 + x ^ 2 + x ^ 1 + x ^ 0 * /#define POLYNOMIAL 0xD419CC15L
static unsigned long crc_table[256];
/* generate the table of CRC remainders for all possible bytes */
void gen_crc_table(void)
{int i, j;unsigned int crc_accum;for(i=0; i < 256; i++) {crc_accum = ((unsigned int) i << 24);for(j=0;  j < 8;  j++) {if (crc_accum & 0x80000000L) {crc_accum = (crc_accum << 1) ^ POLYNOMIAL;} else {crc_accum = (crc_accum << 1);}}crc_table[i] = crc_accum;}
}/* update the CRC on the data block one byte at a time */
unsigned int update_crc(unsigned int crc_accum, unsigned char *datap, unsigned int datak_size)
{int i, j;for(j = 0; j < datak_size; j++) {i = ((unsigned int) (crc_accum >> 24) ^ *datap++) & 0xff;crc_accum = (crc_accum << 8) ^ crc_table[i];}return crc_accum;
}

5、校验和

uint32_t CheckSumCalc(uint8_t inputNum)
{uint32_t rtn_CheckSum = 0u;uint32_t i = 0u;uint32_t tmp_CheckSum = 0xFFFFFFFF;for(i = 0; i < tmp_length; i++){tmp_CheckSum = tmp_CheckSum^(~tmp_Value);}rtn_CheckSum = ~tmp_CheckSum;return rtn_CheckSum;
}

这篇关于汽车电子 -- CRC校验码详解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/746438

相关文章

如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别详解

《如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别详解》:本文主要介绍如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别的相关资料,描述了如何使用海康威视设备网络SD... 目录前言开发流程问题和解决方案dll库加载不到的问题老旧版本sdk不兼容的问题关键实现流程总结前言作为

SQL 中多表查询的常见连接方式详解

《SQL中多表查询的常见连接方式详解》本文介绍SQL中多表查询的常见连接方式,包括内连接(INNERJOIN)、左连接(LEFTJOIN)、右连接(RIGHTJOIN)、全外连接(FULLOUTER... 目录一、连接类型图表(ASCII 形式)二、前置代码(创建示例表)三、连接方式代码示例1. 内连接(I

Go路由注册方法详解

《Go路由注册方法详解》Go语言中,http.NewServeMux()和http.HandleFunc()是两种不同的路由注册方式,前者创建独立的ServeMux实例,适合模块化和分层路由,灵活性高... 目录Go路由注册方法1. 路由注册的方式2. 路由器的独立性3. 灵活性4. 启动服务器的方式5.

Java中八大包装类举例详解(通俗易懂)

《Java中八大包装类举例详解(通俗易懂)》:本文主要介绍Java中的包装类,包括它们的作用、特点、用途以及如何进行装箱和拆箱,包装类还提供了许多实用方法,如转换、获取基本类型值、比较和类型检测,... 目录一、包装类(Wrapper Class)1、简要介绍2、包装类特点3、包装类用途二、装箱和拆箱1、装

Go语言中三种容器类型的数据结构详解

《Go语言中三种容器类型的数据结构详解》在Go语言中,有三种主要的容器类型用于存储和操作集合数据:本文主要介绍三者的使用与区别,感兴趣的小伙伴可以跟随小编一起学习一下... 目录基本概念1. 数组(Array)2. 切片(Slice)3. 映射(Map)对比总结注意事项基本概念在 Go 语言中,有三种主要

Python中Markdown库的使用示例详解

《Python中Markdown库的使用示例详解》Markdown库是一个用于处理Markdown文本的Python工具,这篇文章主要为大家详细介绍了Markdown库的具体使用,感兴趣的... 目录一、背景二、什么是 Markdown 库三、如何安装这个库四、库函数使用方法1. markdown.mark

PLsql Oracle 下载安装图文过程详解

《PLsqlOracle下载安装图文过程详解》PL/SQLDeveloper是一款用于开发Oracle数据库的集成开发环境,可以通过官网下载安装配置,并通过配置tnsnames.ora文件及环境变... 目录一、PL/SQL Developer 简介二、PL/SQL Developer 安装及配置详解1.下

使用Navicat工具比对两个数据库所有表结构的差异案例详解

《使用Navicat工具比对两个数据库所有表结构的差异案例详解》:本文主要介绍如何使用Navicat工具对比两个数据库test_old和test_new,并生成相应的DDLSQL语句,以便将te... 目录概要案例一、如图两个数据库test_old和test_new进行比较:二、开始比较总结概要公司存在多

css渐变色背景|<gradient示例详解

《css渐变色背景|<gradient示例详解》CSS渐变是一种从一种颜色平滑过渡到另一种颜色的效果,可以作为元素的背景,它包括线性渐变、径向渐变和锥形渐变,本文介绍css渐变色背景|<gradien... 使用渐变色作为背景可以直接将渐China编程变色用作元素的背景,可以看做是一种特殊的背景图片。(是作为背

springboot日期格式化全局LocalDateTime详解

《springboot日期格式化全局LocalDateTime详解》文章主要分析了SpringBoot中ObjectMapper对象的序列化和反序列化过程,并具体探讨了日期格式化问题,通过分析Spri... 目录分析ObjectMapper与jsonSerializer结论自定义日期格式(全局)扩展利用配置