奇偶校验_校验和实验
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验5-1纠错与检错
1.实验内容
读程序,在所有红色的“#”后面添加解释,说明程序的作用
2.实验题目
(1)奇偶校验码
在原始模式上增加一个附加比特位,即奇偶校验位,使最后整个模式中1的个数为奇数(奇校验)或偶数(偶校验)。
本程序用到列表、字符串合并、取模等概念。
code=input("Please input a 7-bit-binary code:")
a=0
# for 循环作用是什么
for i in range(0,6,1):
if code[i]=='1':
a=a+1
print("After odd parity checking the code is:")
if a%2==0:
print(code+'1') # 这句做了什么
else:
print(code) # 这句做了什么
print("After even parity checking the code is:")
# 下面 if .. else …作用是什么
if a%2==0:
print(code)
else:
print(code+'1')
(2) 垂直水平奇偶校验
如下图所示,14个字符纵向排列形成一个数据块,每个字符占据一列,低位比特在上,高位比特在下,用b8(第8位)作为垂直奇偶校验位,各字符的同一比特位形成一行,每一行的最右边一位作为水平奇偶校验位,这里在垂直和水平方向均采用偶校验。
# 下面的函数做了什么 def oddeven(l): a=0
for i in range(0,len(l),1): if l[i]=='1': a=a+1 if a%2==0: return '0' else:
return '1'
block=[['0']*15,['0']*15,['0']*15,['0']*15,['0']*15,['0']*15,['0']*15,['
0']*15]
for i in range(0,14,1):
vcode=input("Please input a 7-bit-binary code:") for j in range(0,7,1): block[j][i]=vcode[j]
block[7][i]=oddeven(vcode) # 这句做了什么 hcode=['0']*14
for j in range(0,8,1):
for i in range(0,14,1): hcode[i]=block[j][i]
block[j][14]=oddeven(hcode) # 这句做了什么 print(block)
(3)循环冗余校验
任何一个二进制位串都可以用一个多项式来表示,多项式的系数只有0和1,n 位长度的码C 可以用下述n -1次多项式表示:
()n 1n 210C x C x C x C x C --=++
++n-1n-21
例如位串1010001可以表示为x 6
+x 4
+1。
数据后面附加上冗余码的操作可以用多项式的算术运算来表示。例如,一个k 位的信息码后面附加上r 位的冗余码,组成长度为n=k+r 的码,它对应一个(n -1)次的多项式C(x),信息码对应一个(k -1)次的多项式K(x),冗余码对应一个(r -1)次的多项式R(x),C(x)与K(x)和R(x)之间的关系满足:
()()()r C x x K x R x =+ 由信息码生成冗余码的过程,即由已知的K(x)求R(x)的过程,也是用多项式的算术运
算来实现。其方法是:通过用一个特定的r 次多项式G(x)去除x r
K(x),即:
()
()
r x K x G x 得到的r 位余数作为冗余码R(x)。其中G(x)称为生成多项式(generator polynomial ),是由通信的双方预先约定的。除法中使用模2减法(无借位减,相当于作异或运算)。要进行的多项式除法,只要用其相对应的系数进行除法运算即可。
本例中,10位二进制信息位串对应K(x)=x 9+x 8+ x 6+x 4+ x 3
+ x+1;CRC_4对应的G(x)=
x 4+ x +1,r=4,则生成位串为10011B=19。则x r K(x)= x 13+x 12+ x 10+x 8+x 7+x 5+x 4 ,对应位串
11010110110000,R(x)的计算如错误!未找到引用源。所示,得出的4位余数1110作为冗余码,于是实际传输的位串为11010110111110。
参考程序:(本程序用到函数,列表、字符串合并、取整、取模等概念。) # 这个函数做了什么
def c2n(l): a=0
for i in range(0,len(l),1):
a=a+int(l[i])*(2**(len(l)-1-i)) return a
# 下面这个函数做了什么 def n2c(d): b = ''
while d!=0:
b = str(d%2)+b d = d//2 return b
informationcode=input("Please input a 10-bit-binary code:") code=informationcode+'0000' producecode=19 p=0 j=0
xorcode='' while p<14:
j=5-len(xorcode) # 下面语句做了什么
xorcode=n2c(c2n(xorcode+code[p:p+j-1])^producecode) p=p+j
print(informationcode+xorcode)
(4)校验和
校验和的算法流程如下: 发送方算法:
将待发送的数据划分成若干长度为16位的位串,每个位串看成是一个二进制数。 对这些16位的二进制数进行1的补码和累加运算,累加的结果再取反作为校验和,附
1 1 0 0 0 0 1 0 1 0
1 1 0 1 0 1 1 0 1 1 0 0 0 01 0 0 1 1
1 0 0 1 1 1 0 0 1 1 1 0 0 1 1
0 0 0 0 0 1 0 1 1 0
1 0 0 1 1
1 0 1 0 0 1 0 0 1 1
1 1 1 0
余数