Problem Description
CRC的基本思想:
将二进制位串看成系数为0或1的多项式。使用CRC编码时,发送方和接收方必须事先商定一个生成多项式G(x),生成多项式的最高位和最低位的系数必须是1。
假设一个帧有m位,对应的多项式为M(x),为了计算它的校验和,该帧必须比生成多项式长。
CRC的原理:
在帧的尾部追加一个校验和,使得追加之后的帧所对应的多项式能够被G(x)整除。
当接收方收到了带校验和的帧后,用G(x)去除它,如果有余数,则表示传输过程中有错误。
计算CRC校验和的算法:
① 假设G(x)的阶为r。在帧的尾部加上r个0,构成的帧包含m+r位,对应的多项式为x^r*M(x);
② 利用模2做除法。用G(x)去除x^r*M(x),得x^r*M(x) /G(x) = Q(x) + R(x)/G(x) ,其中Q(x)为商,R(x)为余数。
③ 利用模2做减法。用x^r*M(x)减去余数R(x),结果就是将要被传输的带校验和的帧,记为T(x)= x^r*M(x) – R(x)。
例如:
设M(x) = 101001,除数 G(x) = 1101,则m=6,r=3。
则被除数是 x^r*M(x) = 101001000。
模2运算的结果是:商Q = 110101,余数R = 001。
把余数R作为冗余码添加在数据M的后面发送出去。发送的数据是:x^r*M(x) + R ,即101001001,共(m + r)位。
编程实现:使用循环冗余检验CRC计算帧检验序列FCS,并输出发送的帧。
Input Description
输入为两行。
第一行输入M位二进制,表示待发送的数据。(M<=100)
第二行输入R+1位二进制,表示生成多项式的系数。(R<=32)
Output Description
在一行中输出加上FCS后发送的数据。
Sample Input
101001
1101
Sample Output
101001001
Hint
我的想法:
我的代码:
def crc(m,p):
# 计算被除数的长度======要除的次数
len_of_m = len(m)
# 计算除数的长度
len_of_p = len(p)
# n是要添加的0的个数
n = len_of_p - 1
while n > 0:
m.append(0)
n -= 1
#对r进行切片,里面有len_of_p位
r = m[0:len_of_p]
# p是除数,r是与之相对应的4位被除数,循环的次数是p的长度
for i in range(0, len_of_p):
r[i] = r[i] ^ p[i]
#第一次完成后继续执行
for s in range(len_of_p, len_of_m + len_of_p - 1):
#r中的后三位移动到前面来
r[0:len_of_p - 1] = r[1:len_of_p]
r[len_of_p - 1] = m[s]
# 判断第一位是否为0
if r[0] == 0:
for i in range(len_of_p):
r[i] = r[i] ^ 0
else:
for i in range(len_of_p):
r[i] = r[i] ^ p[i]
# 返回的是除第一位以外的数
fcs = r[1:]
return fcs
if __name__ == '__main__':
#字符串转整数,转成list
a = list(map(int, input()))
b = list(map(int, input()))
#不希望函数内部修改传切片
fcs = crc(a[:], b[:])
a += fcs
tx = "".join(map(str, a))
print(tx)