奇偶校验 累加和校验 CRC校验

奇偶校验:

所谓通讯过程的校验是指在通讯数据后加上一些附加信息,通过这些附加信息来判断接收到的数据是否和发送出的数据相同。比如说RS232

串行通讯可以设置奇偶校验位,所谓奇偶校验就是在发送的每一个字节后都加上一位,使得每个字节中1的个数为奇数个或偶数个。比如我们要

发送的字节是0x1a,二进制表示为0001 1010。

采用奇校验,则在数据后补上个0,数据变为0001 1010 0,数据中1的个数为奇数个(3个)

采用偶校验,则在数据后补上个1,数据变为0001 1010 1,数据中1的个数为偶数个(4个)

接收方通过计算数据中1个数是否满足奇偶性来确定数据是否有错。(这种方式的正确率不高,一旦发生偶数个比特位错误就无法检测出来


累加和校验:


另一种常见的校验方式是累加和校验。所谓累加和校验实现方式有很多种,最常用的一种是在一次通讯数据包的最后加入一个字节的校验数

据。这个字节内容为前面数据包中全部数据的忽略进位的按字节累加和。比如下面的例子:

我们要传输的信息为: 6、23、4

加上校验和后的数据包:6、23、4、33

这里 33 为前三个字节的校验和。接收方收到全部数据后对前三个数据进行同样的累加计算,如果累加和与最后一个字节相同的话就认为传输的数据没有错误。

累加和校验由于实现起来非常简单,也被广泛的采用。但是这种校验方式的检错能力也比较一般,对于单字节的校验和大概有1/256 的概率将

原本是错误的通讯数据误判为正确数据。之所以这里介绍这种校验,是因为CRC校验在传输数据的形式上与累加和校验是相同的,都可以表示

为:通讯数据 校验字节(也可能是多个字节)


CRC校验:

CRC 算法的基本思想是将传输的数据当做一个位数很长的数。将这个数除以另一个数。得到的余数作为校验数据附加到原数据后面。还以上

面例子中的数据为例:

1、将X的最高次幂为R的生成多项式G(X)转换成对应的R+1位二进制数。

2、将信息码左移R位,相当于对应的信息多项式C(X)*2R。

3、用生成多项式(二进制数)对信息码做除,得到R位的余数(注意:这里的二进制做除法得到的余数其实是模2除法得到的余数,并不等于其对应十进制数做除法得到的余数。)。

4、将余数拼到信息码左移后空出的位置,得到完整的CRC码。

【例】假设使用的生成多项式是G(X)=X3+X+1。4位的原始报文为1010,求编码后的报文。

解:

1、将生成多项式G(X)=X3+X+1转换成对应的二进制除数1011。

2、此题生成多项式有4位(R+1)(注意:4位的生成多项式计算所得的校验码为3位,R为校验码位数),要把原始报文C(X)左移3(R)位变成1010000

3、用生成多项式对应的二进制数对左移3位后的原始报文进行模2除(高位对齐),相当于按位异或:

1010000

1011

------------------

0001000

1011

------------------

0011

得到的余位011,所以最终编码为:1010011


  • 3
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
奇偶校验是一种简单的校验方法,它通过在原始信息位后面添加一个校验位来检测数据传输过程中的错误。具体来说,奇偶校验会统计原始信息位中1的个数,如果1的个数是偶数,则在校验位上写入0,否则写入1。在接收端,接收到数据后会重新计算1的个数,如果计算结果与校验位不一致,则说明数据传输过程中出现了错误。 CRC校验是一种更为复杂的校验方法,它通过在原始信息位后面添加R个校验位来检测数据传输过程中的错误。具体来说,CRC校验会将原始信息位看作一个多项式,然后通过除法运算得到余数,将余数作为校验位添加到原始信息位后面。在接收端,接收到数据后会重新进行除法运算,如果余数为0,则说明数据传输过程中没有出现错误。 以下是Python中实现CRC校验的示例代码: ```python import binascii def crc(data): # 定义生成多项式 generator = 0x1021 # 初始化CRC值 crc = 0xFFFF # 逐位计算CRC值 for b in data: for i in range(8): bit = (b >> (7 - i)) & 1 c15 = (crc >> 15) & 1 crc <<= 1 if c15 ^ bit: crc ^= generator # 返回CRC值 return crc & 0xFFFF # 测试 data = b'hello world' crc_value = crc(data) print(hex(crc_value)) ``` 以上代码中,我们定义了一个生成多项式0x1021,然后对数据进行逐位计算,最终得到CRC值。在实际应用中,生成多项式的选择会影响到CRC校验的性能和可靠性。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值