CRC16校验算法

计算CRC16(循环冗余校验)校验值是一种广泛应用于数据传输的错误检测方法。以下是详细步骤和原理说明:基本计算原理‌选择多项式‌:使用预设的16位多项式(如0x1021用于CRC-16-CCIT

计算CRC16(循环冗余校验)校验值是一种广泛应用于数据传输的错误检测方法。以下是详细步骤和原理说明:

基本计算原理
        ‌选择多项式‌:使用预设的16位多项式(如0x1021用于CRC-16-CCITT)
        ‌初始化寄存器‌:设置16位寄存器初始值(通常为0xFFFF)
‌逐位处理‌:
        数据与寄存器高位异或
        寄存器左移1位
        若移出位为1,则与多项式异或
        ‌最终处理‌:返回寄存器值(通常需截断为16位)
详细步骤(以CRC-16-CCITT为例)
        ‌初始化CRC寄存器‌:crc = 0xFFFF
        ‌遍历每个数据字节‌:
        a. 将字节与CRC高8位异或:crc ^= (byte << 8)
        b. 对每个bit位循环(8次):
        若最高位为1:crc = (crc << 1) ^ 多项式
        若最高位为0:crc = crc << 1
        强制16位:crc &= 0xFFFF
        ‌返回结果‌:return crc
不同标准对比
标准类型    多项式    初始值    结果处理    应用场景
CRC-16-CCITT    0x1021    0xFFFF    无    XMODEM, Bluetooth
CRC-16-IBM    0x8005    0x0000    无    Modbus, USB
CRC-16-MODBUS    0x8005    0xFFFF    异或0x0000    工业通信
C++实现示例(CRC-16-CCITT)
#include <cstdint>
#include <vector>

uint16_t calculateCRC16(const std::vector<uint8_t>& data) {
    uint16_t crc = 0xFFFF;  // 初始值
    
    for (uint8_t byte : data) {
        crc ^= static_cast<uint16_t>(byte) << 8;  // 字节与高8位异或
        
        for (int i = 0; i < 8; ++i) {
            if (crc & 0x8000)  // 检测最高位
                crc = (crc << 1) ^ 0x1021;  // 多项式异或
            else
                crc <<= 1;
            
            crc &= 0xFFFF;  // 保持16位
        }
    }
    return crc;
}
验证示例
输入:"123456789" (字节形式)
输出:‌0x29B1‌(与标准测试向量一致)

实际应用技巧
‌预计算加速‌:使用256元素的查询表优化8位计算
// 生成CRC表
void generateCRCTable(uint16_t table[256]) {
    for (int i = 0; i < 256; ++i) {
        uint16_t crc = i << 8;
        for (int j = 0; j < 8; ++j) {
            crc = (crc << 1) ^ ((crc & 0x8000) ? 0x1021 : 0);
        }
        table[i] = crc & 0xFFFF;
    }
}
‌流式处理‌:支持分段计算CRC


uint16_t updateCRC(uint16_t crc, uint8_t byte) {
    crc = (crc << 8) ^ crcTable[(crc >> 8) ^ byte];
    return crc & 0xFFFF;
}
‌字节序处理‌:网络传输时需转换为大端序


void sendCRC(uint16_t crc) {
    uint8_t bytes[2] = {
        static_cast<uint8_t>(crc >> 8),  // 高字节在前
        static_cast<uint8_t>(crc & 0xFF) // 低字节在后
    };
    // 发送bytes数组
关键点:CRC16不是加密哈希,而是错误检测码。不同标准不可互换,选择需与实际协议一致。对于高效实现,推荐使用预计算查表法(LUT),速度可比直接计算快10倍以上。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值