使用C语言写一个CRC16的校验函数,输入数组的地址和长度,返回两字节的校验码
时间: 2024-12-11 19:29:22 浏览: 10
当然可以,CRC16(循环冗余校验)是一个常见的校验技术,常用于通信和存储系统中确认数据的一致性。这里是一个基本的C语言函数,使用CRC16-CCITT标准(也称为CRC-CCITT-16或CRC-16-Iso),用于计算输入数组的CRC校验码:
```c
#include <stdint.h>
// CRC16-CCITT polynom: x^16 + x^15 + x^2 + 1
static const uint16_t CRC16_TAB[] = {
0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50A5, 0x60C6, 0x70E7,
// ... and the rest of the table (256 entries total)
};
uint16_t crc16_ccitt(const uint8_t* data, size_t length) {
uint16_t crc = 0xFFFF;
for (size_t i = 0; i < length; i++) {
crc = (crc >> 8) ^ CRC16_TAB[(crc ^ data[i]) & 0x00FF];
}
// Perform final XOR with all ones value to complete the polynomial division
crc ^= 0xFFFF;
return crc;
}
// 示例用法
int main() {
uint8_t input[] = {0x01, 0x03, 0x00, 0x00, 0x00, 0x02, 0xC4, 0x0B};
uint16_t calculated_crc = crc16_ccitt(input, sizeof(input));
// 将CRC转换为两字节表示
uint8_t crc_bytes[2] = {(calculated_crc >> 8) & 0xFF, calculated_crc & 0xFF};
// 输出或保存CRC bytes
printf("CRC16: %02X%02X\n", crc_bytes[0], crc_bytes[1]);
return 0;
}
阅读全文