//.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);
}