c语言 crc校验代码
时间: 2023-12-19 07:30:08 浏览: 38
以下是一个C语言实现CRC校验的例子:
```c
#include <stdio.h>
#include <stdint.h>
#define CRC_POLY 0x1021
uint16_t crc16(uint8_t *data, uint16_t length) {
uint16_t crc = 0xFFFF;
for (int i = 0; i < length; i++) {
crc ^= (uint16_t)data[i] << 8;
for (int j = 0; j < 8; j++) {
if (crc & 0x8000) {
crc = (crc << 1) ^ CRC_POLY;
} else {
crc <<= 1;
}
}
}
return crc;
}
int main() {
uint8_t data[] = {0x01, 0x02, 0x03, 0x04};
uint16_t crc = crc16(data, sizeof(data));
printf("CRC16: 0x%04X\n", crc);
return 0;
}
```
该例子中使用了CRC-16的多项式0x1021,对数据数组进行了CRC校验,并输出了校验结果。你可以根据需要修改多项式和数据来进行校验。
相关问题
C语言CRC校验程序代码 编写
以下是一个简单的C语言CRC校验程序代码:
```
#include <stdio.h>
unsigned int crc32(unsigned char *buf, unsigned int size) {
unsigned int crc = 0xffffffff;
unsigned int table[256] = {0};
unsigned int i, j;
// 初始化CRC表
for (i = 0; i < 256; i++) {
crc = i;
for (j = 0; j < 8; j++) {
crc = crc & 1 ? (crc >> 1) ^ 0xedb88320 : crc >> 1;
}
table[i] = crc;
}
// 计算CRC校验值
crc = 0xffffffff;
for (i = 0; i < size; i++) {
crc = table[(crc ^ buf[i]) & 0xff] ^ (crc >> 8);
}
return crc ^ 0xffffffff;
}
int main() {
unsigned char buf[] = {0x01, 0x02, 0x03, 0x04, 0x05};
unsigned int size = 5;
unsigned int crc = crc32(buf, size);
printf("CRC校验值:%08x\n", crc);
return 0;
}
```
以上代码实现了CRC32校验算法。通过对需要校验的数据进行计算,得到一个32位的校验值,用于验证数据是否被篡改。
c语言实现crc校验代码及注释
以下是一个常见的C语言实现CRC校验的代码,包含了详细的注释,供参考:
```c
#include <stdio.h>
#define POLY 0x1021 // CRC16校验多项式
#define INIT 0xFFFF // CRC16校验初始值
/* CRC16校验函数 */
unsigned short crc16(unsigned char *data, int len) {
unsigned int crc = INIT; // 初始化CRC16校验值
for (int i = 0; i < len; i++) {
crc ^= (unsigned int)(data[i] << 8); // 将数据的高8位与CRC16校验值异或
for (int j = 0; j < 8; j++) {
if (crc & 0x8000) { // 如果CRC16校验值的最高位为1
crc = (crc << 1) ^ POLY; // 左移一位并与CRC16校验多项式异或
} else {
crc <<= 1; // 左移一位
}
}
}
return (unsigned short)crc; // 返回CRC16校验值
}
int main() {
unsigned char data[] = {0x01, 0x02, 0x03, 0x04, 0x05}; // 待校验的数据
int len = sizeof(data) / sizeof(unsigned char); // 数据长度
unsigned short crc = crc16(data, len); // 计算CRC16校验值
printf("CRC16: 0x%04X\n", crc); // 输出CRC16校验值
return 0;
}
```
代码中使用了一个`crc16()`函数来计算CRC16校验值,该函数的输入参数包括待校验的数据指针和数据长度,输出参数为CRC16校验值。函数中使用了一个`crc`变量来保存CRC16校验值,初始值为`INIT`。接下来对数据中的每一个字节进行处理,处理方式为将该字节的高8位与CRC16校验值异或,然后对该结果进行8次循环操作,每次循环都判断CRC16校验值的最高位是否为1,如果是,则将CRC16校验值左移1位并与CRC16校验多项式`POLY`异或,如果不是,则只将CRC16校验值左移1位。处理完成后,返回CRC16校验值。在主函数中,我们定义了一个`data`数组来保存待校验的数据,然后通过调用`crc16()`函数计算CRC16校验值,并将结果输出。