常见校验方法

0. CRC校验(Cyclic Redundancy Check)

基本原理:

  1. 生成多项式​:选择一个固定的多项式,称为生成多项式。这个多项式定义了CRC计算的方式。在实际应用中,这个多项式通常表示为一个二进制数。
  2. 数据处理​:在原始数据后附加足够的0,其数量通常等于生成多项式的阶数。例如,如果多项式是8位长,就会附加8个0。
  3. 模二除法​:将修改后的数据通过模二除法(除法操作中,加法和减法替换为异或操作)除以生成多项式。这种除法不涉及借位和进位。
  4. 计算校验和​:除法的余数就是CRC校验和。这个校验和是通过原始数据和生成多项式计算得到的,然后将其作为错误检测的标志附加到数据末尾。

应用:

  1. 网络通信​:在网络层如Ethernet(以太网)和其他许多类型的网络通信协议中,CRC用于保证数据包在网络传输过程中的完整性。数据包的接收方可以通过计算接收到的数据包的CRC来检测是否发生了传输错误。
  2. 数据存储​:在数据存储设备如硬盘驱动器、固态硬盘和USB闪存驱动器中,CRC用于确保数据写入过程中没有错误发生。任何由于硬件故障、电磁干扰或软件缺陷引起的数据损坏都可以通过CRC检测到。
  3. 文件校验​:软件下载或文件传输时,CRC可以用来验证文件的完整性。下载或接收文件后,用户可以执行CRC校验来确认文件是否在传输过程中被篡改或损坏。
  4. 实时系统​:在实时数据传输如串行通信和无线通信系统中,CRC检测可以快速地发现错误,并要求数据重传,这对于保持数据传输的可靠性至关重要。

CRC异或运算的基本概念:

异或运算(XOR)是一种二进制运算,遵循以下规则:

  • 相同为0(1 XOR 1 = 0 和 0 XOR 0 = 0)
  • 不同为1(1 XOR 0 = 1 和 0 XOR 1 = 1)

在CRC计算中,我们利用这个运算来检测数据中的变化(错误)。生成多项式定义了这种检测的模式。

CRC校验的推演过程:

假设我们的输入数据是8位:1001 1100(即0x9C),我们的任务是计算这个数据的4位CRC。

  1. 初始化和准备数据​:

    • 使用生成多项式:0011(即0x3)
    • 初始CRC设置为:0000
    • 数据左移4位(为CRC计算腾出位置):1001 1100 0000
  2. 逐位处理​: 我们将从最高位开始逐位处理数据。这里,我们将数据的每一位与CRC的最高位(逐步生成)进行比较和处理。
  3. 第一轮处理(最高位)​:

    • 当前CRC:0000,左移一位:0000 0
    • 当前数据最高位:1
    • 异或结果(CRC最高位与数据最高位):0 XOR 1 = 1
    • 由于结果为1,我们需要将当前CRC(已左移的)与生成多项式0011进行异或:00000 XOR 0011 = 0011
  4. 接下来的每一步都类似​:

    • 对于每一位,都重复“左移、比较、根据需要异或生成多项式”的过程。
  5. 最终CRC​:

    • 经过全部数据位的处理后,剩余在CRC寄存器中的4位即为最终的CRC结果。

示例:

我们来逐步看几个步骤的计算,仅考虑最初几个数据位的处理:

  • 初始数据​:1001 1100 0000,​初始CRC​:0000
  • 处理第1位​:

    • CRC左移:00000(额外位考虑)
    • 异或操作(因为1 XOR 0 = 1):00000 XOR 0011 = 0011
  • 处理第2位​:

    • CRC左移:00110
    • 异或操作(因为0 XOR 1 = 1):00110 XOR 0011 = 0001
  • 处理第3位​:

    • CRC左移:00010
    • 不需要异或(因为0 XOR 0 = 0)

这个过程会持续直到所有的数据位都被处理过。最终的CRC值是在最后四位中产生的,这就是我们附加到原始数据后面的CRC校验码。

1. 校验和(Checksum)

  • 基本原理​:计算数据中所有字节的总和,通常采用模运算(如模256)来确保校验和的值在一个固定的范围内(如0到255)。接收方计算接收到的数据的校验和,与发送方发送的校验和进行比对。
  • 应用​:校验和广泛用于文件传输和数据通信,如TCP/IP协议栈中的UDP协议就使用简单的校验和来检测数据错误。

2. 奇偶校验(Parity Check)

  • 基本原理​:添加一个额外的奇偶校验位,以使得带有校验位的字节中1的个数为奇数(奇校验)或偶数(偶校验)。奇偶校验通常用于检测单比特错误。
  • 应用​:奇偶校验在串行通信和计算机内存中很常见,是最简单的错误检测编码。

3. LRC(纵向冗余校验)

  • 基本原理​:计算数据块中每一列(按位计算)的奇偶校验,生成一个校验字节。LRC是一种错误检测技术,用于校验数据块的完整性。
  • 应用​:LRC常用于银行卡磁条数据的传输校验。

4. MD5和SHA家族(散列函数)

  • 基本原理​:虽然不是传统意义上的“校验”,散列函数生成一个数据的固定长度的摘要或散列值。这些散列值通常用于验证数据的完整性,任何微小的数据变化都会导致散列值的显著变化。
  • 应用​:散列函数在安全传输、文件校验和数据完整性验证中非常重要。MD5、SHA-1和SHA-256是最常用的散列算法。

5. 互联网校验和(Internet Checksum)

  • 基本原理​:一种特定的校验和方法,用于在互联网协议(IP)、传输控制协议(TCP)和用户数据报协议(UDP)等互联网通信协议中检测数据的完整性和正确性。
  • 应用​:该校验和广泛应用于互联网数据包的错误检测。

6. 文件完整性校验码(例如: Adler-32)

  • 基本原理​:Adler-32是一种比CRC32更快但检错能力稍弱的校验和算法,主要计算数据的和以及这些和的和。
  • 应用​:常用于某些文件传输协议中,比如在zlib压缩库中广泛使用。
最后修改:2024 年 07 月 18 日
如果觉得我的文章对你有用,请随意赞赏