当前位置:首页C语言 > 正文

用c语言实现crc校验

作者:野牛程序员:2024-11-06 21:42:02C语言阅读 2319
用c语言实现crc校验

用c语言实现crc校验

CRC(循环冗余校验)是一种常用于网络通信和存储设备的数据校验方法。以下是用 C 语言实现 CRC 校验的一个简单示例,基于常见的 CRC-32 算法。

#include <stdio.h>
#include <stdint.h>

// CRC-32 查找表(只计算一次,之后用于加速)
uint32_t crc32_table[256];

// 生成 CRC-32 查找表
void generate_crc32_table() {
    uint32_t polynomial = 0xedb88320;
    for (uint32_t i = 0; i < 256; i++) {
        uint32_t crc = i;
        for (uint32_t j = 8; j > 0; j--) {
            if (crc & 1) {
                crc = (crc >> 1) ^ polynomial;
            } else {
                crc = crc >> 1;
            }
        }
        crc32_table[i] = crc;
    }
}

// 计算数据的 CRC-32 校验值
uint32_t calculate_crc32(const uint8_t *data, size_t length) {
    uint32_t crc = 0xffffffff; // 初始值是 0xFFFFFFFF

    for (size_t i = 0; i < length; i++) {
        uint8_t byte = data[i];
        uint32_t index = (crc ^ byte) & 0xff;
        crc = (crc >> 8) ^ crc32_table[index];
    }

    return ~crc; // 返回反转后的 CRC 值
}

int main() {
    // 生成 CRC-32 查找表
    generate_crc32_table();

    // 测试数据
    const uint8_t data[] = "Hello, CRC!";
    size_t length = sizeof(data) - 1;  // 排除末尾的 null 字符

    // 计算 CRC-32 校验值
    uint32_t crc_value = calculate_crc32(data, length);
    printf("CRC-32: 0x%08X\n", crc_value);

    return 0;
}


野牛程序员教少儿编程与信息学奥赛-微信|电话:15892516892
野牛程序员教少儿编程与信息学竞赛-微信|电话:15892516892
  • 用c语言实现crc校验
  • 相关推荐

    最新推荐

    热门点击