CRC-32校验和CRC-32校验代码

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;
}

你可能感兴趣的:(CRC32和CRC16校验)