CRC循环冗余码计算

初步条件

1.假设数据位有7位,为 101001

D(初始) = 101001 

2.假设给定约定多项式为4位,为1100,可求得阶级r为len(1100) - 1 = 4-1 = 3

P(多项式) = 1100

r = len(P) -1 = 4-1 = 3

3.根据流程,计算过程中的数据位需要在末尾加上 第二步所求的阶级数数量的阿拉伯数字0,也是是加上三个0

                 D(计算中的数据位) = 101001000

                                                                 

计算过程

那么可以写出计算式初始稿如下:

我们先求第一位商,多项式有四位,我们就在D(计)的第四位上置放1

(区别一.与普通除法的除不尽第一位为0不同,第len(P)位无条件放置1

然后像普通除法一样把除数沉下去,这一步在计算冗余码中是固定不变的,不受任何因素的影响,如图:

接下来就是冗余码除法计算中区别于普通除法的第二个地方

区别二:普通除法的单过程取模是直接相减,但是在这里需要使用模2除,可以简单的理解为两两进行独立异或计算且不存在进位):

演示

    a:1010

    b:1100

    c:待求

这两数进行模2除的求解过程

a为取模过程中的上位数,b为下位数 c为所求结果

a[0] = 1, b[0] = 1  那么c[0]的结果为这两数的异或计算(相同为0不同为1) ,1异或1等于0,所以c[0] = 0

a[1] = 0, b[1] = 1,所以c[1] =  1

a[2] = 1, b[2] = 0,所以c[2] = 1

a[3] = 0, b[3] = 0,所以c[3] = 0

故 c = 0110 

     

如下:

发现 这一步的模运算结果为0110,前置的0我们需要进行忽略,那么实际上只有3位的110剩余,而3位不足以被四位的1100所除,这里可以像普通除法一样从上面拉下来一个数字

发现满足要求可以继续除,那么继续在商处放置一个1(什么时候放0后面会讲到),且将1*1100的结果1100放置于平齐最后一步的的一个有效数字下:

在进行异或计算,直到上面的商没位置即运算完成

最后的结果0100即使我们所求的FCS余数:

故最终所发数据应为 D(初) + FCS = 101001 + 0100   

= 1010010100 

### 关于CRC循环冗余校验 CRC(Cyclic Redundancy Check,循环冗余校验)是一种基于多项式除法的错误检测技术。其基本原理是在发送端按照特定算法计算出一个校验值附加到数据后面,在接收端再重新计算该值并与接收到的校验值比较来判断传输过程中是否有误。 对于给定的一个二进制序列作为消息以及另一个较短的二进制序列作为生成多项式的系数表示形式,通过模2除法运算得出余数即为所求得CRC字[^1]。 具体来说: - 发送方将待传送的信息位串左移若干位形成被除数; - 使用预定义好的生成多项式执行模2除法操作直到商长度等于原信息位串; - 所得到的最终余数就是用来做纠错验证用的CRC校验,并将其附加上去构成完整的帧结构准备发出; 下面给出一道简单的练习题用于理解上述过程: 假设要发送的消息M=1001110, 采用标准CRC-3 (G(x)=x^3+x+1),则整个编后的字符串应如何构建? 解题步骤如下所示: ```python def crc_remainder(input_bitstring, polynomial_bitstring, initial_filler): len_input = len(input_bitstring) initial_padding = initial_filler * (len(polynomial_bitstring) - 1) input_padded_array = list(input_bitstring + initial_padding) while '1' in input_padded_array[:len_input]: cur_shift = input_padded_array.index('1') for i in range(len(polynomial_bitstring)): input_padded_array[cur_shift + i] = str(int(polynomial_bitstring[i] != input_padded_array[cur_shift + i])) return ''.join(input_padded_array)[len_input:] message = "1001110" generator_polynomial = "1011" # G(x)=x^3+x+1 对应的二进制表达 crc_code = crc_remainder(message, generator_polynomial, '0') print(f"CRC Code: {crc_code}") encoded_message = message + crc_code print(f"Encoded Message: {encoded_message}") ``` 运行此Python脚本可以获取到经过CRC处理之后的实际输出结果。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值