问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

什么是循环冗余校验码CRC 循环冗余校验码的原理和计算步骤

创作时间:
作者:
@小白创作中心

什么是循环冗余校验码CRC 循环冗余校验码的原理和计算步骤

引用
1
来源
1.
https://www.juhe.cn/news/index/id/9850

循环冗余校验码(Cyclic Redundancy Check,CRC)是一种广泛应用于数据传输和存储中的错误检测技术。它通过在发送方计算一个校验值,并将其附加到数据中,在接收方重新计算校验值并进行对比,从而检测数据传输过程中是否发生了错误。CRC具有高效、可靠的特点,被广泛应用于通信协议、文件系统、磁盘驱动器等领域。本文将详细探讨什么是循环冗余校验码,以及其原理和计算步骤。通过对这些内容的深入分析,读者可以全面理解CRC的工作机制,并掌握如何在实际应用中使用这一强大的错误检测工具。

一、什么是循环冗余校验码(CRC)

1)定义

循环冗余校验码(Cyclic Redundancy Check,CRC)是一种用于检测数据传输或存储过程中发生的错误的技术。CRC通过在发送方计算一个校验值,并将其附加到数据中,在接收方重新计算校验值并进行对比,从而检测数据是否在传输过程中发生了改变。CRC的主要特点是高效、可靠,能够检测出大多数常见的传输错误。

2)应用场景

CRC广泛应用于各种数据传输和存储场景,包括但不限于:

  1. 通信协议:如以太网、Wi-Fi、USB等通信协议中,CRC用于确保数据包的完整性。
  2. 文件系统:如FAT、NTFS、ext4等文件系统中,CRC用于检测文件系统的元数据是否损坏。
  3. 磁盘驱动器:如硬盘、固态硬盘等存储设备中,CRC用于检测扇区数据是否正确读取。
  4. 嵌入式系统:如汽车电子、工业控制等嵌入式系统中,CRC用于确保数据传输的可靠性。

3)CRC与其他错误检测方法的比较

  1. 奇偶校验:简单但只能检测单个比特错误,无法检测多位错误。
  2. 校验和:比奇偶校验更复杂,能够检测多位错误,但仍然存在漏检的可能性。
  3. CRC:通过多项式除法实现,能够检测绝大多数常见的传输错误,具有更高的可靠性。

二、循环冗余校验码的原理

1)多项式表示法

CRC的核心原理是基于多项式除法。在CRC中,数据块被视为一个二进制多项式,每个比特位代表多项式的系数。例如,数据块1011可以表示为多项式x^3 + x + 1。同样,生成多项式(Generator Polynomial)也用二进制形式表示,通常是一个固定的多项式,如CRC-32使用的生成多项式为0x04C11DB7。

2)多项式除法

CRC的计算过程类似于长除法,但使用的是模2除法(即不考虑进位)。具体步骤如下:

  1. 初始化:将数据块转换为二进制多项式,并在其后附加与生成多项式长度相同数量的零比特。
  2. 除法:用生成多项式去除扩展后的数据多项式,得到商和余数。
  3. 余数:余数即为CRC校验值,通常附加到原始数据的末尾。

3)校验值的生成

通过上述多项式除法,最终得到的余数就是CRC校验值。这个校验值通常是一个固定长度的二进制数,如8位、16位、32位等。不同的应用场景可能使用不同长度的CRC校验值,以平衡计算复杂度和错误检测能力。

4)错误检测

在接收方,接收到的数据块(包含原始数据和CRC校验值)再次进行相同的多项式除法操作。如果计算得到的余数为零,则说明数据未发生错误;否则,说明数据在传输过程中发生了错误,需要采取相应的纠错措施。

三、循环冗余校验码的计算步骤

  1. 数据准备

假设我们要计算一个简单的CRC-32校验值,生成多项式为0x04C11DB7(即x^32 + x^26 + x^23 + x^22 + x^16 + x^12 + x^11 + x^10 + x^8 + x^7 + x^5 + x^4 + x^2 + x + 1),数据块为0x12345678。

  1. 初始化

首先,将数据块转换为二进制形式,并在其后附加32个零比特(因为CRC-32的生成多项式为33位):

初始数据:0x12345678
二进制形式:00010010001101000101011001111000
附加零比特:0001001000110100010101100111100000000000000000000000000000000000

  1. 多项式除法

接下来,用生成多项式0x04C11DB7去除扩展后的数据多项式。为了简化说明,我们使用伪代码表示多项式除法的过程:

def crc32(data, poly=0x04C11DB7):
    crc = 0xFFFFFFFF
    for byte in data:
        crc ^= byte << 24
        for _ in range(8):
            if crc & 0x80000000:
                crc = (crc << 1) ^ poly
            else:
                crc <<= 1
            crc &= 0xFFFFFFFF
    return crc ^ 0xFFFFFFFF

在这个过程中,每次处理一个字节的数据,并通过移位和异或操作模拟多项式除法。最终得到的余数即为CRC-32校验值。

  1. 结果验证

在接收方,接收到的数据块(包含原始数据和CRC校验值)再次进行相同的多项式除法操作。如果计算得到的余数为零,则说明数据未发生错误;否则,说明数据在传输过程中发生了错误。

def verify_crc32(data, crc_received):
    crc_computed = crc32(data)
    return crc_computed == crc_received

# 实际案例
data = b'\u0012\u0034\u0056\u0078'
crc_received = 0xE3069283  # 假设这是从发送方接收到的CRC值

# 计算CRC-32校验值
crc_computed = crc32(data)

# 验证CRC值
if verify_crc32(data, crc_received):
    print("数据传输成功,无错误")
else:
    print("数据传输失败,检测到错误")

综上所述,循环冗余校验码(CRC)是一种高效的错误检测技术,广泛应用于数据传输和存储领域。CRC通过多项式除法计算校验值,并在接收方进行验证,能够检测出绝大多数常见的传输错误。相比其他错误检测方法,CRC具有更高的可靠性和灵活性。掌握CRC的工作原理和计算步骤,有助于我们在实际应用中更好地使用这一强大的错误检测工具,确保数据传输的完整性和可靠性。无论是通信协议、文件系统还是嵌入式系统,CRC都能发挥重要作用,为用户提供更加稳定和可靠的体验。在未来的发展中,随着数据传输和存储技术的进步,CRC的应用场景将进一步拓展。结合其他先进的错误检测和纠正技术,CRC将继续为现代信息系统提供坚实的基础保障。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号