crc16 c语言 非查表,CRC16CCITT(1021)的16字表长查表程序
时间: 2023-09-04 11:11:46 浏览: 145
以下是一份基于移位运算的非查表实现的CRC16CCITT算法的C语言代码:
```c
#include <stdint.h>
#define CRC16_CCITT_POLY 0x1021
uint16_t crc16_ccitt(const uint8_t *data, uint32_t len) {
uint16_t crc = 0xFFFF;
for (uint32_t i = 0; i < len; i++) {
crc ^= (uint16_t)data[i] << 8;
for (uint8_t j = 0; j < 8; j++) {
if (crc & 0x8000) {
crc = (crc << 1) ^ CRC16_CCITT_POLY;
} else {
crc <<= 1;
}
}
}
return crc;
}
```
在这份代码中,我们首先定义了CRC16_CCITT_POLY常量,表示CRC16 CCITT算法中的生成多项式0x1021。接下来定义了一个crc16_ccitt函数,该函数接收一个指向数据缓冲区和数据长度的指针,返回计算得到的CRC16校验值。在函数内部,我们首先将crc变量初始化为0xFFFF,然后依次处理每个字节的数据。对于每个字节,我们将其左移8位,并异或到crc上。接下来,我们进行8次循环,每次检查crc的最高位是否为1,如果是,就将crc左移1位并异或生成多项式,否则只将crc左移1位。最后返回crc即为计算得到的CRC16校验值。
需要注意的是,由于该实现不使用查表,因此计算速度较慢。对于较大的数据块,推荐使用查表实现以提高计算效率。
阅读全文