//CRC16 校验
u16 ComputeCRC16(unsigned char *buf, int offset, int len)
{
u16 num = 0;
int i = 0;
u8 j, num3;
for(i = 0; i < len; i++) {
num3 = buf[i + offset];
for(j = 0; j < 8; j = (unsigned char)(j + 1)) {
num = (((num3 ^ ((unsigned char)num)) & 1) == 0) ? ((u16)(num >> 1)) : ((u16)((num >> 1) ^ 0xa001));
num3 = (unsigned char)(num3 >> 1);
}
}
return num;
}
// CRC16 多项式 (CCITT/ITU 标准)
#define POLY 0x8005
// 查找表大小
#define TABLE_SIZE 256
// CRC16 查找表
unsigned int crc16_table[TABLE_SIZE];
// 初始化查找表
void init_crc16_table() {
unsigned int crc;
int i, j;
// 预填充查找表
for (i = 0; i < TABLE_SIZE; i++) {
crc = i;
for (j = 8; j > 0; j--) {
if (crc & 1)
crc = (crc >> 1) ^ POLY;
else
crc >>= 1;
}
crc16_table[i] = crc;
}
}
// 计算CRC16
unsigned int crc16(const unsigned char *dat, size_t len) {
unsigned int crc = 0xFFFF;
unsigned int temp = 0;
int i;
for (i = 0; i < len; i++) {
crc = crc16_table[(crc^dat[i])&0xFF] ^ (crc >> 8);
}
return crc ^ 0xFFFF;
}
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
// CRC32 多项式
#define POLY 0xEDB88320
// 查找表大小
#define TABLE_SIZE 256
// CRC32 查找表
uint32_t crc32_table[TABLE_SIZE];
// 初始化查找表
void init_crc32_table() {
uint32_t crc;
int i, j;
// 预填充查找表
for (i = 0; i < TABLE_SIZE; i++) {
crc = i;
for (j = 8; j > 0; j--) {
if (crc & 1)
crc = (crc >> 1) ^ POLY;
else
crc >>= 1;
}
crc32_table[i] = crc;
}
}
// 计算CRC32
uint32_t crc32(const unsigned char *data, size_t len) {
uint32_t crc = 0xFFFFFFFF;
int i;
for (i = 0; i < len; i++) {
crc = crc32_table[(crc ^ data[i]) & 0xFF] ^ (crc >> 8);
}
return crc ^ 0xFFFFFFFF;
}
int main() {
const unsigned char data[] = "\x01\x02\x03\x04\x05\x06\x07\x08\x09";
size_t len = sizeof(data) - 1;
uint32_t crc;
// 初始化CRC32查找表
init_crc32_table();
// 计算CRC32
crc = crc32(data, len);
// 输出CRC32值
printf("The CRC32 value is: %08X\n", crc);
return 0;
}