CRC校验(C语言)

uint16_t ModbusCRC16(uint8_t *data, uint16_t length) 
{
    uint16_t crc = 0xFFFF;  // CRC初始值
    
    for (uint16_t i = 0; i < length; i++) {
        crc ^= (uint16_t)data[i];  // XOR字节数据
        
        for (uint8_t j = 0; j < 8; j++) {
            if (crc & 0x0001) {   // 检查LSB
                crc >>= 1;        // 右移1位
                crc ^= 0xA001;    // XOR多项式值
            } else {
                crc >>= 1;        // 右移1位
            }
        }
    }
    return crc;
}

<think>我们被要求用中文回答问题,并在最后提出3-5个相关问题,且第一行必须是“§§相关问题§§”,然后列出问题。 问题:crc校验 c语言 首先,我们需要解释什么是CRC校验,并给出一个用C语言实现的示例。 CRC(循环冗余校验)是一种根据数据生成简短固定位数校验码的算法,主要用于检测数据传输或存储后可能出现的错误。 下面是一个简单的CRC校验的C语言实现示例,以CRC-16为例(使用常见的多项式0xA001,即CRC-16-IBM):</think>### CRC校验的C语言实现 CRC(循环冗余校验)是一种常用的数据传输错误检测算法,通过多项式除法计算校验码。以下是CRC-16(IBM标准)的C语言实现示例: ```c #include <stdint.h> #define CRC16_POLY 0xA001 // 反转多项式(0x8005的反转) uint16_t crc16(uint8_t *data, size_t length) { uint16_t crc = 0xFFFF; // 初始值 for (size_t i = 0; i < length; i++) { crc ^= data[i]; // 与数据字节异或 for (int j = 0; j < 8; j++) { if (crc & 0x0001) { // 检查最低位 crc = (crc >> 1) ^ CRC16_POLY; } else { crc >>= 1; } } } return crc; } // 使用示例: // uint8_t data[] = {0x01, 0x02, 0x03}; // uint16_t checksum = crc16(data, sizeof(data)); ``` #### 关键说明: 1. **多项式选择**:`0xA001`是常用CRC-16-IBM的反转多项式 2. **初始值**:`0xFFFF`是标准初始值 3. **计算过程**: - 逐字节异或 - 按位右移并检测最低位 - 若最低位为1则异或多项式 4. **输出**:返回的16位值即为CRC校验码 #### 应用场景: - 串口通信 - 网络数据包校验 - 存储介质错误检测
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值