wow-crc文件说明
- 项目地址:https://gitee.com/wow-iot/wow-iot7
- 本文件的的功能实现crc-8、crc-16、crc-32各种模式下的计算。
crc-8计算
计算模式包括:
CRC-8 x8+x2+x+1
CRC-8/ITU x8+x2+x+1
CRC-8/ROHC x8+x2+x+1
CRC-8/MAXIM x8+x5+x4+1
uint8_t wow_crc8(uint8_t *pu8Data, uint32_t u32Size)
{
uint8_t wCRCin = 0x00;
uint8_t wCPoly = 0x07;
int i = 0;
while (u32Size--)
{
wCRCin ^= *(pu8Data++);
for(i = 0;i < 8;i++)
{
if(wCRCin & 0x80)
wCRCin = (wCRCin << 1) ^ wCPoly;
else
wCRCin = wCRCin << 1;
}
}
return (wCRCin);
}
crc-16计算
计算模式包括:
CRC-16/CCITT x16+x12+x5+1
CRC-16/XMODEM x16+x12+x5+1
CRC-16/X25 x16+x12+x5+1
CRC-16/IBM x16+x15+x2+1
CRC-16/MAXIM x16+x15+x2+1
CRC-16/USB x16+x15+x2+1
CRC-16/DNP x16+x13+x12+x11+x10+x8+x6+x5+x2+1
uint16_t wow_crc16_modbus(uint8_t *pu8Data, uint32_t u32Size)
{
uint16_t wCRCin = 0xFFFF;
uint16_t wCPoly = 0x8005;
int i = 0;
InvertUint16(&wCPoly,&wCPoly);
while (u32Size--)
{
wCRCin ^= *(pu8Data++);
for(i = 0;i < 8;i++)
{
if(wCRCin & 0x01)
wCRCin = (wCRCin >> 1) ^ wCPoly;
else
wCRCin = wCRCin >> 1;
}
}
return (wCRCin);
}
crc-32计算
计算模式包括:
CRC-32 x32+x26+x23+x22+x16+x12+x11+x10+x8+x7+x5+x4+x2+x+1
CRC-32/MPEG-2 x32+x26+x23+x22+x16+x12+x11+x10+x8+x7+x5+x4+x2+x+1
uint32_t wow_crc32(uint8_t *pu8Data, uint32_t u32Size)
{
uint32_t wCRCin = 0xFFFFFFFF;
uint32_t wCPoly = 0x04C11DB7;
int i = 0;
InvertUint32(&wCPoly,&wCPoly);
while (u32Size--)
{
wCRCin ^= *(pu8Data++);
for(i = 0;i < 8;i++)
{
if(wCRCin & 0x01)
wCRCin = (wCRCin >> 1) ^ wCPoly;
else
wCRCin = wCRCin >> 1;
}
}
return (wCRCin ^ 0xFFFFFFFF) ;
}