dong-frank的博客

第四讲 数据校验码

字数统计: 975阅读时长: 3 min
2025/02/18

第四讲 数据校验码

纠错

存储额外的信息以进行检错和校正
处理过程

  1. 数据输入:使用函数𝑓在𝑀位数据𝐷上生成𝐾位校验码C
  2. 数据输出:使用函数𝑓在𝑀位数据𝐷’上生成新的𝐾位代码𝐶”,并与取出的𝐾位码𝐶’进行比较

在信息传输过程中, D和C都可能出错

奇偶校验码

增加1位校验码来表示数据中1的数量是奇数还是偶数
输入数据:
奇校验: C=𝐷𝑀⊕⋯⊕𝐷2⊕𝐷1⊕1 奇数个1时为0
偶校验: 𝐶=𝐷𝑀⊕⋯⊕𝐷2⊕𝐷1 偶数个1时为0

输出数据:
奇校验: 𝐶”=𝐷’𝑀⊕⋯⊕𝐷’2⊕𝐷’1⊕1
偶校验: 𝐶”=𝐷’𝑀⊕⋯⊕𝐷’2⊕𝐷’1

检错:S=𝐶′′⊕𝐶′

  1. 𝑆=0:正确/数据中出错的位数为偶数
  2. 𝑆=1:数据中出错的位数为奇数

适用于对较短长度(如1字节)的数据进行检错

海明码

将数据分成几组,对每一组都使用奇偶校验码进行检错
处理过程

  1. 将𝑀位数据分成𝐾组
  2. 数据输入:为数据𝐷中每组生成1位校验码,合并得到𝐾位校验码C
  3. 数据输出:为数据𝐷′中每组生成1位校验码,合并得到新的𝐾位校验码𝐶′′
  4. 检错:将校验码𝐶′′和取出的校验码C’ 按位进行异或,生成𝐾位故障字

校验码的长度应为多少(应该分为多少组)
要能覆盖所有情况

  1. 数据中有1位出现错误:M
  2. 校验码中有1位出现错误:K
  3. 没有出现错误:1
    所以2^𝐾 ≥𝑀+𝐾+1

故障字的作用: 每种取值都反应一种情形(数据出错/校验码出错/未出错)
规则

  • 全部是0:没有检测到错误
  • 有且仅有1位是1:错误发生在校验码中的某一位,不需要纠正
  • 有多位为1:错误发生在数据中的某一位,将𝐷′中对应数据位取反即可纠正(得到𝐷”)

具体怎么做

  1. 列出K位故障字共2^K种选择的表格
  2. 根据规则分配情形(相当于分组了)
  3. 根据分组计算每一位海明码的值
  4. 根据故障字中, 表示校验码出错的位置, 将海明码填入原数据的固定位置中
  5. 检错时如果出现数据位错误直接取反即可, 如果是校验码出错不用管

循环冗余校验

海明码问题

  1. 额外成本很大
  2. 要求将数据分成字节

循环冗余校验

  • 适用于以流格式存储和传输大量数据
  • 用数学函数生成数据和校验码之间的关系

基本思想

  1. 假设数据有M位,左移数据K位(右侧补0),并用K+1位生成多项式除它(模2运算)
  2. 采用K位余数作为校验码
  3. 把校验码放在数据(不含补的0)后面,一同存储或传输

检错

  1. 如果M+K位内容可以被生成多项式除尽,则没有检测到错误
  2. 否则,发生错误

生成多项式: 率先选择好的一个数

模2运算
准备数据:假设数据有M位,生成多项式有K+1位。将数据左移K位(右侧补0),得到一个新的数据序列。

初始化:将生成多项式对齐到数据的最高位。

按位除法:

如果当前数据的最高位是1,则将生成多项式与当前数据的最高位对齐部分进行异或运算。
如果当前数据的最高位是0,则跳过异或运算,直接将生成多项式右移一位。
将生成多项式右移一位,继续下一位的运算。
重复步骤3,直到处理完所有数据位。

余数:最后剩下的K位就是校验码。

易错题目

alt text

CATALOG
  1. 1. 第四讲 数据校验码
    1. 1.1. 纠错
    2. 1.2. 奇偶校验码
    3. 1.3. 海明码
    4. 1.4. 循环冗余校验
    5. 1.5. 易错题目