C语言实现的CRC16/CCITT-FALSE校验码函数
时间: 2024-03-12 11:43:47 浏览: 48
以下是C语言实现的CRC16/CCITT-FALSE校验码函数代码:
```c
#include <stdint.h>
uint16_t crc16_ccitt_false(const uint8_t *data, size_t length)
{
uint16_t crc = 0xFFFF;
for (size_t i = 0; i < length; ++i) {
crc ^= (uint16_t)data[i] << 8;
for (size_t j = 0; j < 8; ++j) {
if (crc & 0x8000) {
crc = (crc << 1) ^ 0x1021;
} else {
crc = crc << 1;
}
}
}
return crc;
}
```
该函数使用了CRC-CCITT(XModem)算法,生成的校验码长度为16位。传入函数的参数`data`是待校验的数据的首地址,`length`是数据的长度。函数返回计算出的校验码。
相关问题
crc16校验c语言实现
下面是一个简单的实现:
```c
#include <stdio.h>
#define POLY 0x1021 // CRC-16-CCITT polynomial
#define INIT 0xFFFF // initial value of CRC register
unsigned short crc16(unsigned char *data, int len) {
unsigned short crc = INIT;
int i, j;
for (i = 0; i < len; i++) {
crc ^= (unsigned short)data[i] << 8;
for (j = 0; j < 8; j++) {
if (crc & 0x8000) {
crc = (crc << 1) ^ POLY;
} else {
crc <<= 1;
}
}
}
return crc;
}
int main() {
unsigned char data[] = {0x01, 0x02, 0x03, 0x04};
int len = sizeof(data) / sizeof(data[0]);
unsigned short result = crc16(data, len);
printf("CRC-16: 0x%04X\n", result);
return 0;
}
```
其中,`POLY` 定义了校验码的多项式,`INIT` 定义了 CRC 寄存器的初始值。
函数 `crc16` 接收一个 `unsigned char` 类型的指针和一个 `int` 类型的长度参数,返回一个 `unsigned short` 类型的校验码。
在主函数中,我们通过定义一个 `unsigned char` 类型的数组 `data` 来模拟待校验的数据,然后调用 `crc16` 函数得到校验码并输出。
用c编写CRC-16-CCITT
以下是用C语言编写CRC-16-CCITT的示例代码:
```c
#define CRC16_CCITT 0x1021
unsigned short crc16_ccitt(const unsigned char *buf, int len)
{
unsigned short crc = 0xFFFF;
for (int i = 0; i < len; i++)
{
crc ^= (unsigned short)buf[i] << 8;
for (int j = 0; j < 8; j++)
{
if (crc & 0x8000)
{
crc = (crc << 1) ^ CRC16_CCITT;
}
else
{
crc <<= 1;
}
}
}
return crc;
}
```
这个函数的作用是计算CRC-16-CCITT校验码,输入参数是一个unsigned char类型的指针和一个int类型的长度值,输出结果是一个unsigned short类型的校验码。函数中使用了位操作和循环来实现CRC校验算法,并且采用了CRC-CCITT多项式0x1021作为生成多项式。