【算法】深入了解 CRC 校验码的计算过程

引言

在通信和数据存储过程中,数据的完整性至关重要。为了检测和纠正传输错误,校验技术被广泛应用。CRC(循环冗余校验,Cyclic Redundancy Check)是一种常见的错误检测方法,它通过生成冗余码来确保数据传输的可靠性。在这篇文章中,我们将探讨 CRC 码的基本原理,并详细介绍其计算过程。

CRC 校验码的原理

CRC 校验基于 模 2 除法 原理,它将数据视为二进制数串,然后通过一个预定的 生成多项式 来计算数据的余数。这个余数就是 CRC 校验码。具体过程如下:

  1. 数据二进制表示:将待校验的数据转换为二进制表示。
  2. 生成多项式:选择一个生成多项式,这是 CRC 算法的核心。常用的多项式包括 CRC-32、CRC-16 等。
  3. 附加零位:在数据末尾附加若干个零位,这些零位的个数取决于生成多项式的位数。
  4. 模 2 除法:将附加了零位的数据通过生成多项式进行二进制除法运算,得出的余数就是 CRC 校验码。

CRC 计算的步骤

  1. 确定生成多项式 CRC 的生成多项式是一组预定义的位模式。例如,对于 CRC-16,多项式可以表示为: G(x) = x\^{16} + x\^{15} + x\^2 + 1

    在二进制表示中为 11000000000000101

  2. 附加零位 假设待校验的数据为 8 位,例如 11010101,生成多项式为 16 位,则我们需要在数据后面附加 16 个零,得到: 11010101 \\text{0000000000000000}

  3. 进行模 2 除法 将附加零的数据与生成多项式进行二进制除法。注意,二进制除法与十进制不同,不涉及借位和进位,直接进行异或运算。

    示例:

    复制代码
    11010101 0000000000000000  ÷  11000000000000101

    通过逐步执行除法过程,我们将得到一个 16 位的余数。这就是 CRC 校验码。

  4. 校验码生成 最终的余数作为 CRC 校验码,附加到原始数据之后。这个新的数据包在传输时,如果接收方再次计算 CRC 校验码并与附带的校验码进行比较,可以确定数据是否在传输过程中出现了错误。

代码实现

我们可以通过 Python 来实现 CRC 校验码的计算。以下代码演示了使用 CRC-16 算法的计算过程。

复制代码
def crc16(data: bytes, poly=0x11021, init_val=0xFFFF) -> int:
    crc = init_val
    for byte in data:
        crc ^= byte << 8
        for _ in range(8):
            if crc & 0x8000:
                crc = (crc << 1) ^ poly
            else:
                crc <<= 1
        crc &= 0xFFFF  # 取16位
    return crc

# 示例
data = b"Hello, CRC!"
crc_value = crc16(data)
print(f"CRC-16 计算结果: {crc_value:04X}")

结论

CRC 校验是一种强大的错误检测工具,广泛应用于通信协议、数据存储和网络传输中。通过对数据进行 CRC 校验,我们可以在传输过程中检测到潜在的错误并采取适当的纠正措施。理解 CRC 的计算过程有助于我们更好地使用这种技术,并根据需要优化相关应用。

相关推荐
凤年徐4 分钟前
容器适配器深度解析:从STL的stack、queue到优先队列的底层实现
开发语言·c++·算法
乐迪信息5 分钟前
乐迪信息:AI防爆摄像机的船舶船体烟火智能预警系统
大数据·网络·人工智能·算法·无人机
蓝海星梦7 分钟前
GRPO 算法演进——偏差修正/鲁棒优化/架构扩展篇
论文阅读·人工智能·深度学习·算法·自然语言处理·强化学习
后来后来啊11 分钟前
2026.2.2 & 2.3学习笔记
数据结构·笔记·学习·算法·leetcode
li三河11 分钟前
yolo进行剪枝、蒸馏、量化研究
算法·yolo·剪枝
Emberone16 分钟前
数据结构:算法的时间复杂度和空间复杂度
数据结构·算法
七夜zippoe23 分钟前
Dask:超越内存限制的并行计算——从任务图到分布式调度的实战指南
python·集群·task·array·dataframe·dask
YuTaoShao24 分钟前
【LeetCode 每日一题】3013. 将数组分成最小总代价的子数组 II
算法·leetcode·职场和发展
serve the people26 分钟前
python环境搭建 (五) Dockerfile 和 docker-compose.yml 核心作用
java·python·docker
爱尔兰极光34 分钟前
LeetCode 热题 100--字母异位词分组
算法·leetcode·职场和发展