crc-32校验代码:测试结果如下
uint32_t crc32(uint8_t const * p_data, uint32_t size, uint32_t const * p_crc)
{uint32_t crc;
crc = (p_crc == NULL) ? 0xFFFFFFFF : ~(*p_crc);
for (uint32_t i = 0; i < size; i++)
{
crc = crc ^ p_data[i];
for (uint32_t j = 8; j > 0; j--)
{
crc = (crc >> 1) ^ (0xEDB88320U & ((crc & 1) ? 0xFFFFFFFF : 0));
}
}
return ~crc;
}
crc-16校验代码和测试结果:
uint16_t crc16(uint8_t const * p_data, uint32_t size, uint16_t const * p_crc)
{
uint16_t crc = (p_crc == NULL) ? 0xFFFF : *p_crc;
for (uint32_t i = 0; i < size; i++)
{
crc = (uint8_t)(crc >> 8) | (crc << 8);
crc ^= p_data[i];
crc ^= (uint8_t)(crc & 0xFF) >> 4;
crc ^= (crc << 8) << 4;
crc ^= ((crc & 0xFF) << 4) << 1;
}
return crc;
}
int _tmain(int argc, _TCHAR* argv[])
{
uint8_t p_data[] ={0xDB,0xDD,0x01};
uint32_t data = crc32(p_data,3,NULL);
uint32_t data1=crc16(p_data,3,NULL);
printf("%X,%X",data,data1);
getchar();
return 0;
}