crc16校验算法c语言
时间: 2023-07-26 08:05:58 浏览: 82
以下是 CRC16 校验算法的 C 语言实现:
```c
#include <stdio.h>
#include <stdint.h>
#define POLY 0x8005 // CRC16 标准多项式
uint16_t crc16(uint8_t *data, uint32_t length)
{
uint16_t crc = 0xffff;
uint32_t i, j;
for (i = 0; i < length; i++) {
crc ^= (uint16_t)data[i] << 8;
for (j = 0; j < 8; j++) {
if (crc & 0x8000) {
crc = (crc << 1) ^ POLY;
} else {
crc <<= 1;
}
}
}
return crc;
}
int main(void)
{
uint8_t data[] = {0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef};
uint16_t crc = crc16(data, sizeof(data));
printf("CRC16: 0x%04x\n", crc);
return 0;
}
```
其中,`data` 是待校验的数据,`length` 是数据的长度。`POLY` 是 CRC16 标准多项式,即 `0x8005`。函数返回计算出来的 CRC16 值。
在 `crc16` 函数中,首先将 `crc` 初值设为 `0xffff`,然后依次处理每个数据字节。对于每个字节,将其左移 8 位后与 `crc` 异或,并将结果赋给 `crc`。然后,对于每个字节的每个比特位,如果 `crc` 的最高位为 1,则将 `crc` 左移 1 位后再与多项式异或;否则,将 `crc` 左移 1 位。循环执行完毕后,返回计算出来的 CRC16 值。
阅读全文