BCD码:

4个二进制位 (4bit) —-> 1个十进制位,又因为4个二进制位有2的4次方种状态,也就是16种状态。

16种状态足够表示十进制的0~9,并且还有6种冗余。

8421码:

8421码的映射关系:

0 1 2 3 4 5 6 7 8 9
0000 0001 0010 0011 0100 0101 0110 0111 1000 1001

8421码在计算机中进行加法运算:

​ 十进制: 5 + 8 =13

​ 8421码: 0101 + 1000 =1101

​ 因为1101不再映射表里,所以需要加上冗余的6,也就是0110

​ 所以1101+0110=1 0011

​ 0011在映射表里为3,在高位的1前面补0为0001

​ 所以0001 0011在映射表里为13

注:若相加结果在合法范围内,则无需修正。(因为8421码的二进制位的权值是固定不变的8421,所以8421码也成为有权码

余3码:

余3码映射表:( 8421码 + 0011 (二进制) )

0 1 2 3 4 5 6 7 8 9
0011 0100 0101 0110 0111 1000 1001 1010 1011 1100
  • 余3码的四个二进制每一个二进制没有固定的权值,所以余3码也成为无权码

2421码:

2421码映射表:(与8421码不同是改变了权值的定义)

0 1 2 3 4 5 6 7 8 9
0000 0001 0010 0011 0100 1011 1100 1101 1110 1111
  • 2421码的二进制权值是固定的2421,也是有权码

  • 对于2421码来说,0~ 4范围内所有数字编码的第一位都为0,5~ 9范围内所有的数字编码的第一位都为1

  • 上述的规定第一位是为了避免歧义,例如5可以表示为0101或1011,但规定了数字编码的第一位后就不会存在歧义。

    字符:

    ASCII码:

    数字、字母、符号共128个字符—>7位二进制编码

    可印刷字符:32~126

    数字:48(011 0000)~57(011 1001)

    大写字母:65(100 0001)~90(101 1010)

    小写字母:97(110 0001)~122(111 1010)

    例:已知’A’的ASCII码的值为65,字符’H’存放在某存储单元M中,求M中存放的内容。

    ​ **注意:M中存放的是‘H’的ASCII码(二进制形式)**。

    一:A是第一个字母,H是第8个字母,则H对应的码值=65+(8-1)=72;72对应二进制为100 1000,故M中存放的内容为0100 1000

    二:A的码值65写成二进制为100 0001,A是第一个字母,H是第八个字母,故对应100 1000,M中存放的内容为0100 1000。

      每个存储单元存放的内容为字节(Byte)的整数倍,即8的整数倍,例题假设存放1B

    字符串:

    汉字的表示和编码:

    GB 2312-80:汉字+各种符号共7445个

    区位码:94个区,每区94个位置

    例如:啊,在第16区,01位置。

    将16转换为十六进制为10H,01转换为十六进制为01H,但是为了防止与其它编码冲突,所以在

    16进制的基础上再加上20H,变成30H和21H.这就是国标码,但会与ASCII码冲突,所以再加上80H得到B0H和A1H,这就是汉字计内码,完成汉字在计算机中的存储。

    奇偶校验码:

    信息 A B
    码字 00 01 码距1
    码字(方案二) 00 11 码距2

    码距:两个合法码字对应位上数字的不同的个数

    例如:原本A(00)因为跳变发送到B变成了(01),但因为码距为1,所以无法判断原本发的数据是正确还是错误。

    而A(00)因为跳变变成了01,但码距为2,可以知道发生了错误,因为没有01,但却无法确定是哪一位发生了跳变。所以在整个方案中,有些编码是我们没有用到的,没有用到的编码在发生错误的时候可以帮我们指示错误原因。

    奇校验码:整个校验位(有效信息位和校验位)中1的个数为奇数

    偶校验码:整个校验位(有效信息位和校验位)中1的个数为偶数

    奇偶校验位 有效信息位
    1位 n位

    海明码:

    海明码设计思路:分组校验-->多个校验位-->校验位标注出错位置

    例如:信息位1010

    因为:2的K次方 ≥ n+k+1

    所以:K = 3;

    对于n+k+1:海明码是检验信息中哪一位出错,所以原码n个,检验码k个,出现n+k个位置,k校验码对应2的k次方个状态,如k=3,对应000~ 111八个状态。如果八个状态都为错误状态,就需要一个表示正确状态,所以为n+k+1

    1:设信息位D4 D3 D2 D1(1010)共4位,检验位P3 P2 P1,共3位,对应的海明码为H7 H6 H5 H4 H3 H2 H1。

    2:确定校验位的分布

    H7 H6 H5 H4 H3 H2 H1
    D4 D3 D2 P3 D1 P2 P1
    1 0 1 0 0 1 0

    第二行校验位Pi放在海明码为2的(i-1)次方的位置上,信息位按顺序防到其余位置

    3:求校验位的值:

    ​ H3:3—>0 1 1

    ​ H5:5—>1 0 1

    ​ H6:6—>1 1 0

    ​ H7:7—>1 1 1

    按列看,最左边的列1 1 0 1说明H3 H5 H7不为0,因此用D1 D2 D4进行异或得P1—>0

    第二列1 0 1 1说明H3 H6 H7不为0,因此用D1 D3 D4进行异或得P2—>1

    第三列0 1 1 1说明H5 H6 H7不为0,因此用D2 D3 D4进行异或得P3—>0

4:纠错

校验方程:

S1=P1⊕D1⊕D2⊕D4

S2=P2⊕D1⊕D3⊕D4

S3=P3⊕D2⊕D3⊕D4

接收到:1010010

S1=P1⊕D1⊕D2⊕D4 = 0⊕0⊕1⊕1=0

S2=P2⊕D1⊕D3⊕D4 = 1⊕0⊕0⊕1=0

S3=P3⊕D2⊕D3⊕D4 = 0⊕1⊕0⊕1=0

000无错误。

接收到:1010000

S1=P1⊕D1⊕D2⊕D4 = 0⊕0⊕1⊕1=0

S2=P2⊕D1⊕D3⊕D4 = 0⊕0⊕0⊕1=1

S3=P3⊕D2⊕D3⊕D4 = 0⊕1⊕0⊕1=0

010转换为二进制为2,则第2位出错,该为1010010

(格式如果变化,确定校验位得分布摆放位置变化,计算方法不变)

CRC循环冗余码:

信息位 校验位
K位 R位

例:设生成多项式为G(X) = x的三次方+X的2次方+1,信息码为101001,求对应的CRC码

​ 1:确定K,R以及生成多项式对应的二进制码。

​ K = 信息码的长度 = 6,R = 生成多项式最高次幂 = 3 –> 校验码位数N = K+ R =9

​ 生成多项式G(X) = 1·(X^3)+1·(X^2)+0·(X^1)+1·(X^0),对应的二进制码1101

​ 2:移位:

​ 信息码左移R位,低位补0 —–> 1101000

​ 3:相除(模2除):

​ 对移位后的信息码,用生成多项式进行模2除法,产生余数

1101000 / 1101

模2除:看被除数的最高位是1还是0,根据最高位去上位。减法做不带进位的减法,进行异或运算(相同为0,不同为1),最终取得的余数为校验位。对应的CRC码就是信息码+校验位。

4:检错和纠错:

例:发送:101001001 记为C9C8C7C6C5C4C3C2C1

​ 接收:101001001—–>用1001进行模2除—->余数000,代表没出错。

​ 接收:101001011—->用1101进行模2除—->余数为010,二进制转换为2,C2出错,但不是绝对,因为000只能代表8位,并不能完全表示。

原循环冗余码 出错一位后的循环冗余码 出错位 余数
101001 001 101001 000 1 001
101001 011 2 010
101001 101 3 011
101000 001 4 100
101011 001 5 101
101101 001 6 110
100001 001 7 111
111001 001 8 001
001001 001 9 010

假设信息位是K,校验位是R,那么CRC的位数就是R + K ,而R的校验位,可以表示的数从0到2R-1,而0用来表示正确的情况,那么一共有2R-1种错误码,其中每个错误码对应一位,因此我们可以得到一个公式,当满足2R - 1 >= K+R的时候,CRC才具有纠错功能。而且我们可以发现余数是每7个一个循环,出错位1和出错位8的余数是一样的,出错位2和出错位9的余数是一样的,所以这也是为什么叫做循环冗余码的原因。

为什么一般我们不提及CRC的纠错功能,因为CRC一般用在计算机网络中,在以太网的MAC帧中,通常4字节的效验码(FCS)不但用来检验MAC帧的数据部分,还用来检验目的地址、原地址和类型字段(60~1514)字节,信息位远远大于校验位,因此我们一般不提及CRC的纠错功能,但这并不代表没有。