记录 CRC16 校验

//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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值