uint16_t checkCRC(uint8_t *pData, uint32_t plen) { if (NULL == pData || plen <= 0) { return 0; } uint16_t u16CRC = 0xFFFF; for (int i = 0; i < plen; i++) { u16CRC ^= (uint16_t)(pData[i]); for(int j = 0; j <= 7; j++) { if (u16CRC & 0x0001) { u16CRC = (u16CRC >> 1) ^ 0xA001; } else { u16CRC = u16CRC >> 1; } } } uint16_t siRet = 0; siRet = (u16CRC & 0x00FF) << 8; siRet |= u16CRC >> 8; return siRet; }
时间: 2024-04-25 15:27:24 浏览: 60
各种CRC生成工具,包括CRC8,CRC16,CRC-CCITT,CRC32
5星 · 资源好评率100%
这段代码是一个计算 CRC 校验值的函数,函数接受两个参数,一个是 uint8_t 类型的指针 pData,指向需要计算 CRC 校验值的数据缓冲区;另一个是 uint32_t 类型的 plen,表示需要计算 CRC 校验值的数据长度。函数返回计算出的 CRC 校验值,是一个 uint16_t 类型的值。
函数内部使用了循环计算的方法,首先初始化一个 16 位的 CRC 校验值为 0xFFFF,然后对每个字节进行处理,通过异或操作将当前字节加入到 CRC 校验值中,然后再进行 8 次循环,每次判断最低位是否为 1,如果是则将 CRC 校验值向右移动一位并异或一个固定值 0xA001,如果最低位为 0,则直接将 CRC 校验值向右移动一位。循环处理完所有字节后,将计算出的 CRC 校验值高低 8 位交换位置得到最终的校验值。
阅读全文