校验码及其种类

一、校验码的介绍

校验码(Error Detection Code)是一种附加在数据末尾的冗余信息,用于检测或纠正数据传输或存储过程中产生的错误。其主要功能是确保数据的完整性和正确性,防止由于噪声、干扰或其他原因导致的数据错误。

校验码通过特定的算法生成,并附加到原始数据的末尾。数据在传输或存储时,接收端会使用相同的算法重新计算校验码,并与接收到的校验码进行比较。如果校验码匹配,则认为数据没有错误;如果不匹配,则检测到错误。

二、校验码的分类

1. 错误检测码(Error Detection Code):用于检测数据传输中的错误,但不具备纠正错误的能力。一旦检测到错误,需要重传数据。
   - 奇偶校验码(Parity Bit):简单的奇偶校验通过在数据末尾添加一个位来使总的1的个数为奇数或偶数。奇偶校验有两种形式,奇校验(parity bit 使得总数为奇数),偶校验(parity bit 使得总数为偶数)
   - 循环冗余校验码(CRC, Cyclic Redundancy Check):通过多项式除法生成校验位,用于检测数据传输中的错误。常用于网络通信和存储设备中。

2. 错误纠正码(Error Correction Code):不仅能检测错误,还能纠正一定数量的错误,从而不需要重传数据。
   - 海明码(Hamming Code):可以通过设置校验位的奇偶性检测和纠正单比特错误。
   - 里德-所罗门码(Reed-Solomon Code):基于多项式编码,可以纠正突发性错误,广泛用于光盘和数字电视中。
   - BCH码(Bose-Chaudhuri-Hocquenghem Code):是一种多项式编码,可以检测并纠正多比特错误,广泛用于通信系统中。

3.其他校验码
   - 低密度奇偶校验码(LDPC, Low-Density Parity-Check Code):采用稀疏矩阵编码,具有接近香农限的性能,应用于现代通信系统如WiFi和卫星通信中。
   - Turbo码:通过两个或多个简单的卷积码组合和迭代解码算法实现高效纠错,广泛应用于3G/4G移动通信和卫星通信中。
   - 卷积码(Convolutional Code):通过对输入数据流进行卷积操作产生校验码,常用于无线通信和卫星通信中。
   - 霍夫曼码(Huffman Code):一种无损数据压缩算法,通过变长编码表实现,虽然主要用于数据压缩,但也可以用于错误检测。

三、校验码的应用

校验码在各种数据通信和存储系统中广泛应用,包括但不限于:如以太网(网络通信)帧中的CRC校验;硬盘、固态硬盘和RAID系统(存储设备)中的纠错码;移动通信(无线通信)中的Turbo码和LDPC码;JPEG图像和MP3音频文件(数据压缩和传输)中的霍夫曼编码和里德-所罗门码。

以下是一些实际应用场景中使用校验码的具体例子:

 1. 奇偶校验码(Parity Bit)
应用场景:简单的串行通信,如UART(通用异步收发传输器)。
例子:
在一个嵌入式系统中,用于传输传感器数据到中央处理单元(CPU)。假设传输的数据是 1010001,并使用偶校验。
- 发送端计算校验位,发送 10100011。
- 接收端检查数据,发现校验位正确,确认数据无误。

 2. 循环冗余校验码(CRC)
应用场景:网络通信协议,如以太网和无线通信中的数据包校验。
例子:
以太网帧传输数据包时,附加CRC校验码以确保数据完整性。
- 发送端:数据 11010011101100,生成多项式 1011,附加CRC余数,传输数据 11010011101100100。
- 接收端:重新计算CRC,如果余数为0,数据无误。

 3. 海明码(Hamming Code)
应用场景:计算机内存中的错误检测和纠正(ECC)。
例子:
服务器内存使用ECC海明码检测和纠正单比特错误。
- 发送端:原始数据 1011,生成海明码 0010101。
- 接收端:如果接收到 0010101,校验发现无误;若接收到 0110101,发现第3位错误并纠正。

 4. 里德-所罗门码(Reed-Solomon Code)
应用场景:光盘(CD/DVD)、QR码和数字电视中的数据校验。
例子:
在QR码中用于纠正读取错误。
- 生成QR码时,数据块 "HELLO",转换为 [72, 69, 76, 76, 79],生成校验码 [32, 45, 20]。
- 读取时,如果有模糊或损坏,使用校验码纠正数据,确保正确读取。

 5. 低密度奇偶校验码(LDPC)
应用场景:现代通信系统,如WiFi、卫星通信和5G网络。
例子:
在WiFi传输中,用于提高抗干扰能力。
- 发送端:数据经过LDPC编码,添加冗余位。
- 接收端:使用LDPC解码算法,检测并纠正多比特错误,确保数据完整。

 6. Turbo码
应用场景:3G/4G移动通信和卫星通信。
例子:
在4G LTE中,确保高速数据传输的可靠性。
- 发送端:数据经过Turbo编码,发送含冗余的编码数据。
- 接收端:使用迭代解码算法纠正传输中的错误。

 7. 卷积码(Convolutional Code)
应用场景:卫星通信、移动通信和深空通信。
例子:
在GPS卫星通信中,确保信号的准确传输。
- 发送端:数据经过卷积编码,发送含冗余的编码数据。
- 接收端:使用维特比算法解码,纠正传输中的错误。

四、例说各种校验码

下面通过几个例子来说明校验码的工作原理和应用。

1.奇偶校验码(Parity Bit)

示例:
假设我们要传输的原始数据是 1010001。

- 偶校验(Even Parity):为了使总的1的个数为偶数,我们需要添加一个校验位。
  - 原始数据 1010001 中有 3 个1,这是奇数。
  - 因此,我们添加一个 1 作为校验位,使得总的1的个数为4(偶数)。
  - 最终数据变为 10100011。

- 奇校验(Odd Parity):为了使总的1的个数为奇数,我们需要添加一个校验位。
  - 原始数据 1010001 中有 3 个1,这是奇数。
  - 因此,我们添加一个 0 作为校验位,使得总的1的个数仍为3(奇数)。
  - 最终数据变为 10100010。

检测:
接收端收到数据后,重新计算校验位。如果校验位与接收的数据不一致,说明数据在传输中出现了错误。

2.循环冗余校验码(CRC)

示例:
假设我们要传输的数据是 11010011101100,生成多项式是 1011。

- 数据扩展:将数据后面添加3个零(生成多项式是4位),变为 11010011101100000。
- 多项式除法:用生成多项式 1011 对扩展后的数据进行二进制除法。11010011101100000 ÷ 1011 得到的余数是 100。
- 附加校验码:将余数100附加到原始数据末尾,得到 11010011101100100。

检测:
接收端收到数据后,使用相同的生成多项式进行除法。如果余数为0,则说明数据无误;否则数据有误。

3.海明码(Hamming Code)

示例:
假设我们要传输的数据是 1011,需要生成海明码来进行纠错。

- 插入校验位:在数据中插入校验位位置,假设我们使用(7,4)海明码,即每4位数据添加3位校验码。
   - 插入校验位后的位置:_ _ 1 _ 0 1 1。
   - 校验位的位置分别是1, 2, 4(从1开始计数)。

- 计算校验位:
   - 第1位校验位:覆盖1, 3, 5, 7位置的数据,即覆盖 1, 0, 1。
     - 校验位 P1 = 1 XOR 0 XOR 1 = 0。
   - 第2位校验位:覆盖2, 3, 6, 7位置的数据,即覆盖 0, 1, 1。
     - 校验位 P2 = 0 XOR 1 XOR 1 = 0。
   - 第4位校验位:覆盖4, 5, 6, 7位置的数据,即覆盖 1, 1。
     - 校验位 P4 = 1 XOR 1 = 0。

- 完整数据:将校验位插入原始数据中,得到 0010101。

检测和纠错:
接收端收到数据后,重新计算校验位。如果校验位与接收数据的校验位不符,根据错误位置进行纠正。例如,如果第3位有误,纠正后的数据为 0011101。

4.里德-所罗门码(Reed-Solomon Code)

示例:
里德-所罗门码常用于纠正突发性错误,如在QR码中。

假设我们有一个数据块 "HELLO"(对应的ASCII码),使用里德-所罗门编码生成校验码。

- 数据编码:将每个字符转换为对应的整数形式,生成数据块 [72, 69, 76, 76, 79]。
- 生成校验码:根据里德-所罗门编码算法,生成校验码 [32, 45, 20]。

- 最终数据:将校验码附加到原始数据后,得到 [72, 69, 76, 76, 79, 32, 45, 20]。

检测和纠错:
接收端收到数据后,使用里德-所罗门解码算法检查并纠正数据中的错误,确保数据完整性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值