循环冗余校验基本算法

也称为多项式编码,是链路层广泛使用的更具纠错能力的方法

基本思想: 将位串看成是系数为 0 或 1 的多项式。一个 k 位帧看作是一个 k-1 次多项式的系数列表,该多项式共有 k 项,从 xk-1 到 XO。这样的多项式认为是 k-1 阶多项式。高次(最左边〉位是 xk-1 项的系数,接下来的位是 xk-2 项的系数,依此类推。

如, 110001 有 6 位,因此代表了一个有 6 项的多项式,其系数分别为 1 、 1 、 0、 0、 0 和 1 :即 1x5+ 1x4+0x3+0x2+0x1+1x0

多项式的算术运算遵守代数域理论规则,以 2 为模来完成。加法没有进位,减法没有借位。加法和减法都等同于异或。例如:

在这里插入图片描述

注意: 使用多项式编码时,发送方和接收方必须预先商定一个生成多项式 G(X),生成多项式的最高位和最低位系数必须是 1 。

计算 CRC 的算法如下:

  1. 假设 G(x)的阶为 r。在帧的低位端加上 r 个 0 位 , 使得该帧现在包含 m+r 位,对应多项式为 x’M(X)
  2. 利用模 2 除法,用对应于 G(x)的位串去除对应于 x、1(x)的位串。
  3. 利用模 2 减法,从对应于 x’M(x)的位串中减去余数(总是小于等于 r 位)。结果就是将被传输的带校验和的帧。它的多项式不妨设为 T(X)

下图展示了采用生成多项式为 G(x)=x4+x+1 计算帧 1101011111 校验和的情形。
在这里插入图片描述

显然, T(x)可以被 G(x)除尽(模 2)。在任何一种除法中,如果将被除数减掉余数,则剩下的差值一定可以被除数除尽。例如,在十进制中,如果 210 278 被 10 941 除,则余数为 2399。从 210 278 中减去 .2399,得到 207 879,它可以被 10 941 除尽。

问题: 商数的每一位是怎么来的?
解答: 看每一次除的第一位是0还是1

另外一个例子,对于101110101,采用110101作为生成多项式,余数为00011
在这里插入图片描述

要注意的是,CRC循环冗余校验是硬件完成的,对于上层软件或用户来说是感觉不到的。因此,发送端对出错的数据帧进行重传是自动进行的,这种差错控制体质常简称为ARQ(自动重传请求/自动请求重传)

这里附Python代码,具体功能我也忘了,整理代码的时候发现我不知道什么时候还敲过这个…

i = 0b110101
ng = 0b101110101

li = len(bin(i))-2

ng = ng<<(li-1)
result = ng

lg = len(bin(ng))-2


up = ""
index = 0
for b in range(lg-li,-1,-1):
    if len(bin(ng))-2-index > len(bin(result))-2:
        up = up + "0"
        print("商0")
    else:
        print("商1")
        up = up + "1"
#         print(bin(result),bin(i<<b))
        result = result^i<<b
    print(bin(result))
    index = index + 1

print("余数为{},商为{},最终结果为{}".format(bin(result)[-li+1:],up,bin(ng+result)[2:]))
  • 12
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值