CRC冗余码(模2除法)python实现

以下是代码,有点注释

def m_two_division(rdata,chushu):

    shang=[]#商

    beichushu=rdata[:len(chushu)]#每一轮的被除数,此处是第一轮的被除数

    for i in range(len(rdata)-len(chushu)+1):

        if len(beichushu)==len(chushu):#如果这一轮被除数的长度等于除数的长度

            shang.append(1)#商为1

            temp=[]#余数

            for j in range(len(chushu)):

                temp.append(chushu[j]^beichushu[j])

            k=0

            if(sum(temp)!=0):#使余数的第一位变为原本余数中第一个1

                while(temp[k]==0):

                    k+=1

                beichushu=[]

                for h in range(len(temp)-k):

                    beichushu.append(temp[h+k])

            else:#如果余数全0

                beichushu=[]

        else:

            shang.append(0)

        if i!=(len(rdata)-len(chushu)):

            beichushu.append(rdata[i+len(chushu)])

    return beichushu#返回余数

#CRC冗余码计算

def CRC_xchange(rdata,chushu):

    for i in range(len(chushu)-1):

        rdata.append(0)

    beichushu=m_two_division(rdata,chushu)

    #求crc

    crc=[]

    if len(beichushu)!=len(chushu)-1:

        for i in range(len(chushu)-1-len(beichushu)):

            crc.append(0)

    crc+=beichushu

    return crc

#CRC冗余码校验

def CRC_examine(hdata,chushu):

    #求余数

    beichushu=m_two_division(hdata,chushu)

    yushu=[]

    yushu=beichushu

    if len(yushu)==0:

        return 1

    else:

        return 0

    

#发送数据

chushu=[1,0,0,1,1]#事先的除数

Rdata=input()#输入原始待传数据

rdata=bin(int(Rdata,16))[2:]#将原始16进制转为2进制

rdata=list(map(int,rdata))#待检验

cRc=CRC_xchange(rdata,chushu)

print('CRC',cRc)

hdata=bin(int(Rdata,16))[2:]#将原始16进制转为2进制

hdata=list(map(int,hdata))#待校验数据

for i in range(len(cRc)):

    hdata.append(cRc[i])

print('待校验数据:',hdata)

Answer=CRC_examine(hdata,chushu)

print('校验结果:')

if Answer==1:

    print('Right!')

else:

    print('Wrong!')

print('反例:')

for i in range(len(hdata)):

    for j in range(i+1,len(hdata)):

        for h in range(j+1,len(hdata)):

            w_data=hdata.copy()

            w_data[i]=w_data[i]^1

            w_data[j]=w_data[j]^1

            w_data[h]=w_data[h]^1

            answer=CRC_examine(w_data,chushu)

            if answer==1:

                print(w_data)

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值