因为 1 个字节(byte)是 8 个比特(bit)组成的。数据传输时双方约定:只用 7 bit 来存储数据,剩下 1 bit 作为校验位(parity bit)。

parity

校验规则是:

  • 如果前面 7 bit 里 1 的数量为奇数(1, 3, 5, 7),则校验位 parity bit 为 1;
  • 如果前面 7 bit 里 1 的数量为偶数(0, 2, 4, 6),则校验位 parity bit 为 0。

这样一来,这个 byte 里 1 的数量一定是偶数,如果接收方发现 1 的数量不是偶数,那就说明出错了,这种情况就可以认为在传输过程中发生了 比特翻转(bit flip),即本来是 0 却变成了 1,或本来是 1 的变成了 0。

当然,如果这个 byte 在传输过程中发生了偶数个比特翻转 bit flip,那校验倒也恰好能通过,但是同一 byte 里多于 1 个比特翻转的概率非常低,因此奇偶校验在实际应用中还是非常简单有效的。

然而,上述奇偶校验只能知道「出错了」,但是无法知道「哪里出错了」,也无法修复出错的部分。

但是在存储的时候,人们往往是知道哪里出错的。试想如果上述 8 个 bit 不是存在同一 byte 里,而是分别存储在 8 块磁盘上(每个硬盘存 1 个 bit),这时候如果某块磁盘突然坏了,是可以准确判断出「哪里出错了」的,只要根据其他 7 块磁盘里的 bit 值,来反推出坏掉的磁盘里存储的是 0 还是 1(把 1 的总数凑成偶数即可),这就可以实现用健康硬盘修复损坏硬盘。

Reference