Problem A: 循环冗余检验CRC

116 篇文章 2 订阅
20 篇文章 0 订阅

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)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小木苓

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值