a
想象(不用想象)一串二进制数据(01011101…,01不规则排列),将其从一个地方传输到另一个地方,数据可能会变化。变化后的数据代表不了原来数据的意思。
我们不想看到这种变化,因此我们引入了”数据校验”。
奇偶校验位
我们在每段信息比特流(0101110…)的末尾添加上1位”0”或”1”,我们称其为”冗余位”。
而我们的校验检测方式,便是对于这串比特流,检测其中”1”的个数是奇数还是偶数。
所谓”奇校验”,便是通过控制”冗余位”是”0”还是”1”,使得整串比特流中的”1”的个数为奇数
$以1010110为例,此时有四个(偶数个)1:\奇校验: 10101101;(冗余位设为1使得1的个数为奇数)\偶校验:10101100;(冗余位设为0使得1的个数为偶数)$
这样,如果比特流中其中一位”0”变成了”1”或者”1”变成了”0”,我们能够通过将”1”的个数和”冗余位”进行比较判断数据是否发生了改变(真的靠谱吗?)
然而,”奇偶校验法”是存在缺点的:
1.只能在 奇数个二进制位改变 的情况下发现错误。(如果是偶数个二进制位发生变化,那么便会”负负得正”,无法发现错误)
2.如果发现了错误,也只能知道数据在传输后发生了改变,并不能知道哪一位/哪几位二进制位发生了改变,因而无法纠正错误,只能要求发送方再发送一遍数据。
汉明码
假设只有1位二进制位发生了改变: