网络原理考点之差错编码及在线计算工具xor crc

如题2019年4月

又如2019年10月

其实这些考点都是很有用的,代表了网络的思想。 

还是那句话,这些词看着挺熟悉,但具体什么意思,还真一时想不起来……。

检错重发:典型差错控制方式,发送端对发送数据进行差错编码,传输后,接收端利用差错编码检错,对于出错的数据,要求发送端重发。单片机项目中用的CRC、校验和等都是这种方式。对应的网络停等、滑动窗口协议都是这种方式。

检错丢弃:出错后,直接丢弃。适用于容许一定比例差错存在,只适用于实时性要求较高的系统。

反馈校验:接收端将收到数据原封不对返回,很简单的检错方法,传输效率低、实时性差。

前向纠错:差错纠正,接收方利用纠错码进行纠错。前向:指对接收的数据向前检查哪一个出错,并纠正。

所谓差错控制都是指  检错后的处理方式。如何检错没说。上面两题答案不说了,自己看!

又如2017年10月

随机噪声:包括热噪声、传导介质引起的噪声具有典型的随机特性。

冲击噪声 :突然发生的噪声,如雷电、电机启停。又被称为突发差错。很显然C是错的。

如何检错?其实就是CRC、奇偶校验、汉明码这些,详见2019-9-20《软考考点笔记之校验码》

软考这篇笔记,没有记录汉明码,因为之前作为新奇的东西,记在了本子上面,现在越来越觉得,本子查看不是很方便!以个网上例子再总结一下。记不住也没什么,再看一遍就是了,但总要有个印象吧,以后再遇到同样的问题时能知道个方向,这就是夯实基础的意义,也是自考专业另一层意义,再说应用其实是小菜了。

海明码:

下面本例以1010110为例进行海明码编码。

第一步先确定需要多少位校验码;

设数据有n位,校验码有x位。则校验码一共有2^x种取值方式。其中需要一种取值方式表示数据正确,剩下(2^x)−1种取值方式表示有一位数据出错。因为编码后的二进制串有n+x位,都可能出错,因此x应该满足:(2^x)−1≥n+x;软考其实就是考这个公式。
使不等式成立的x的最小值就是校验码的位数。在本例中,n=7,解得x=4。


第二步,确定校验码的位置

校验码在二进制串中的位置为2的整数幂,即1、2、4、8、16……..剩下的位置是信息码,绿色为校验位:

这里写图片描述

本例的校验码位置如下图:要具体分析是大端还是小端,这个表是小端,所以只是借鉴思路,没有问题。

这里写图片描述

第三步,计算校验位的值

由于奇偶校验原理一样,偶校验的计算更为简单,实际中多用偶校验,本例中也以偶校验进行计算。

这里写图片描述

如图中:
第一行中每个X跳过1位;第一行所有的X值进行异或是0;第一行的X对应的数据位位置转化为二进制最后一位都是1,即是xxx1这种形式;
第二行中每2个X跳过2位;第二行所有的X值进行异或是0;第二行的X对应的数据位位置转化为二进制倒数第二位一位都是,即是xx1x这种形式;
第三行中每4个X跳过4位;第三行所有的X值进行异或是0;第三行的X对应的数据位位置转化为二进制倒数第三位一位都是1,即是x1xx这种形式;
第四行中每8个X跳过8位;第四行所有的X值进行异或是0;第四行的X对应的数据位位置转化为二进制倒数第四位一位都是1,即是1xxx这种形式;
……..
每一行都是从对应的校验位开始校验,即从第(2^n)/2位开始校验,校验(2^n)/2个,然后跳过(2^n)/2个
下面计算本例子,将表格中的位置用二进制表示:

这里写图片描述

x1的计算:
x1是第一个校验码,位置对应栏所有最后一位为1(xxx1格式)的相异或为0,即

这里写图片描述

x1⊕1⊕0⊕0⊕1⊕0=0;则x1=0;

x2计算:
x2是第二个校验码,位置对应栏所有倒数第二位为1(xx1x格式)的相异或为0,即

这里写图片描述

x2⊕1⊕1⊕0⊕1⊕0=0;则x2=1;

x3计算:
x3是第三个校验码,位置对应栏所有倒数第三位为1(x1xx格式)的相异或为0,即

这里写图片描述

 x3⊕0⊕1⊕0=0;则x3=1;

x4计算:
x4是第四个校验码,位置对应栏所有倒数第四位为1(1xxx格式)的相异或为0,即

这里写图片描述

x4⊕1⊕1⊕0=0;则x4=0;

所以最终的海明码是01110100110。

这里写图片描述

如何校验:??

接收到数据后

分别计算校验码所校验的位置的模二加法。

G1=X1 ⊕ D1 ⊕.. ⊕ D7

G2=X2  ⊕ D1  ⊕... ⊕ D7

...几个校验位列几个。

按十六进制G4G3G2G1=0101H,就代表出错的位置。

补充CRC循环冗余校验的原理:

假设数据传输过程中需要发送15位的二进制信息g=101001110100001,这串二进制码可表示为代数多项式g(x) = x^14 + x^12 + x^9 + x^8 + x^7 + x^5 + 1,其中g中第k位的值,对应g(x)中x^k的系数。将g(x)乘以x^m(m代表h(x)的最高阶数值),既将g后加m个0(完成以上被除数的处理),然后除以m阶多项式h(x),得到的(m-1)阶余项r(x)对应的二进制码r就是CRC编码。

其中,h(x)就代表多项式,除数,注意:所选生成多项式最高阶与最低阶对应的系数必须为1。

            g(x) 代表要发送信息。

举一个例子使用CRC-8算法求101001110100001的效验码。CRC-8标准的h(x) = x^8 + x^7 + x^6 + x^4 + x^2 + 1,既h是9位的二进制串111010101。 

      

经过迭代运算后,最终得到的r是10001100,这就是CRC效验码。

如CRC16的

计算法一般都是:

(1)预置1个16位的寄存器为十六进制FFFF(即全为1),称此寄存器为CRC寄存器;
(2)把第一个8位二进制数据(既通讯信息帧的第一个字节)与16位的CRC寄存器相异或,把结果放于CRC寄存器;CRC高8位异或0相当于没变,低8位相当于除FF(模二除法)为什么呢?

按照常规的思想CRC初始化为0,然后第一个字节先进CRC高位,判断将要左移一们是否为1,若为1则将左移,并且将CRC寄存器高8个字节(其实存的是数据)与多项式(从第二位起)异或(相当于执行了除法),不为1,则光左移?

这时脑子里一定要脑补出这样的图来

这里由于CRC初始化为FFFF,并且往右移,正好反过来了,那么数据肯定也要“反过来”;这样才能保持数据不变。如何反?就是拿数据跟当前CRC里面的数据值异或。
(3)把CRC寄存器的内容右移一位(朝低位)用0填补最高位,并检查右移后的移出位;
(4)如果移出位为0:重复第3步(再次右移一位);如果移出位为1,CRC寄存器与多项式(例如:1010 0000 0000 0001)进行异或;
(5)重复步骤3和4,直到右移8次,这样整个8位数据全部进行了处理;
(6)重复步骤2到步骤5,进行通讯信息帧下一个字节的处理;
(7)将该通讯信息帧所有字节按上述步骤计算完成后(全部的数据按字节都要过一遍CRC校验,这样才叫校验),得到的16位CRC寄存器的高、低字节进行交换;(脑补出的图,往左移的话,就不用交换了)
(8)最后得到的CRC寄存器内容即为:CRC码。发送时,将数据后+CRC码一块发送出去。

对于接收端的处理:

把CRC+数据,理解成二进制数就好了,其实就是已经能整除了,这样发送端再除以之前选定的CRC16多项式,就可以得到零,不是零的话,就说明出错了。

以上计算步骤中的多项式A001(1010 0000 0000 0001)是8005按位颠倒后的结果。

参考CRC冗余校验详解_宗师之路的博客-CSDN博客_crc冗余校验

查表法:

将移位异或的计算结果做成了一个表,就是将0~256放入一个长度为16位的寄存器中的低八位,高八位填充0,然后将该寄存器与多项式例如:1010 0000 0000 0001)按照上述3、4步骤,直到八位全部移出,最后寄存器中的值就是表格中的数据,高八位、低八位分别单独一个表。

项目会用到的CRC:

标准CRC多项式如下表:

注:简记式是把 生成多项式的最高幂次项系数是固定的1,将最高的1统一去掉了。如CRC16  多项式系数为11000000000000101,将最高位去掉1000000000000101,十六进制形式为8005

 CRC校验码使用:

在线CRC计算:On-line CRC calculation and free library - Lammert Bies

在线XOR计算 BCC校验(异或校验)在线计算_ip33.com

刚开始时,可以参照这个验证下算法对不对。这样可以提高信心。

CRC算法参数模型解释:

NAME:参数模型名称。

WIDTH:宽度,即CRC比特数。

POLY:生成项的简写,以16进制表示。例如:CRC-32即是0x04C11DB7,忽略了最高位的"1",即完整的生成项是0x104C11DB7。

INIT:这是算法开始时寄存器(crc)的初始化预置值,十六进制表示。

REFIN:待测数据的每个字节是否按位反转,True或False。

REFOUT:在计算后之后,异或输出之前,整个数据是否按位反转,True或False。

XOROUT:计算结果与此参数异或后得到最终的CRC值。
 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: CRC-16/CCITT是循环冗余校验(Cyclic Redundancy Check)的一种常见算法,它用于对数据进行检验,以确定数据是否在传输过程中发生错误。它的计算原理和实现如下。 CRC-16/CCITT算法使用16位的校验码,它可以检测到多达2^16-1(65535)位错误。 CRC-16/CCITT的计算是基于一个预设的生成多项式,在该算法中,该多项式被定义为0x1021(二进制为10001000000100001)。 算法的实现过程如下: 1. 初始化一个16位的寄存器为全1(0xFFFF),这个寄存器用来保存计算后的校验码。 2. 从数据的最高位开始,逐位地将数据与寄存器的最高位进行异或操作(XOR),然后将寄存器向左移位一位。 3. 如果寄存器的最高位为1,则将寄存器与预设的生成多项式进行异或操作。 4. 继续将数据的下一位与寄存器的最高位进行异或操作,然后将寄存器向左移位一位。重复这个步骤,直到计算完整个数据。 5. 最后得到的寄存器的值就是CRC-16/CCITT的校验码。 在实际的数据传输中,发送方计算数据的CRC-16/CCITT校验码,并将校验码附加在数据的末尾一起发送给接收方。接收方收到数据后,再次计算数据的CRC-16/CCITT校验码,与接收到的校验码进行比较。如果两者相同,表示数据传输没有出错;如果不同,表示数据传输发生错误,需要进行重新传输。 总之,CRC-16/CCITT是一种简单且高效的校验算法,它可以帮助我们检测数据传输过程中的错误,并保证数据的完整性。 ### 回答2: CRC-16/CCITT是一种循环冗余校验码,用于检测数据传输中的错误。它是根据国际电报电话咨询委员会所制定的标准所确定的。 CRC-16/CCITT的计算原理是将发送的数据按位划分为多个字节,并对每个字节进行处理。首先,需要定义一个生成多项式,用来进行CRC计算CRC-16/CCITT的生成多项式为x^16 + x^12 + x^5 + 1。 具体的实现步骤如下: 1. 初始化一个16位的寄存器为0xFFFF。 2. 将第一个字节与寄存器的低8位异或,然后将寄存器右移一位。 3. 如果最低位是1,则将寄存器与0xA001异或,否则不进行异或操作。 4. 重复第2步和第3步,直到处理完所有字节。 5. 最后得到的寄存器内的值就是CRC-16/CCITT的校验结果。 例如,如果要计算字符串"Hello"的CRC-16/CCITT校验码,可以按照如下步骤进行: 1. 将字符'H'转换为ASCII码,得到0x48。 2. 将0x48与0xFFFF异或,然后将寄存器右移一位,得到0x2400。 3. 由于最低位是0,因此不进行异或操作。 4. 重复上述步骤,依次处理剩下的字符。 5. 最终得到的CRC-16/CCITT校验码为0xF303。 通过计算CRC-16/CCITT校验码,我们可以在数据传输过程中检测出错误。如果接收方接收到的数据与计算得到的校验码不一致,就意味着数据可能被篡改或传输过程中出现错误。 ### 回答3: CRC-16/CCITT是一种用于数据传输中的差错检测方法,采用循环冗余校验(CRC)算法,使用16位的校验和。它的计算原理及实现如下。 首先,将要传输的数据按位进行排列,最高位作为第一个比特位,最低位作为最后一个比特位。接着,定义一个初始值为0xFFFF的寄存器,用于存储即将进行校验的数据。 然后,按照以下步骤进行计算和校验: 1. 将第一个比特位输入到寄存器中。 2. 如果寄存器最高位为1,则进行一次异或运算,结果与0x1021进行按位异或。 3. 将寄存器中所有比特位向右移动一位,即除以2,并舍弃最低位。 4. 重复步骤2和3,直到所有的比特位都输入到寄存器中。 当所有比特位输入完毕后,计算得到的寄存器的值就是CRC-16/CCITT的校验和。将该校验和附加在原始数据后面,一起进行传输。 在接收端,接收到数据后,也按照同样的方式进行计算。如果计算得到的校验和与接收到的校验和相同,说明数据在传输过程中没有发生错误;如果不同,则说明数据发生了错误。 CRC-16/CCITT具有快速计算的特点,适用于大部分数据传输场景。它可以有效检测出传输中的错误,并能够根据校验和进行纠错。实际实现时,可以使用位操作和异或运算来进行高效的计算。 总结起来,CRC-16/CCITT是一种通过对数据进行位操作和异或运算得到校验和的差错检测方法,能够有效检测传输中的错误。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

guangod

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

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

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

打赏作者

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

抵扣说明:

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

余额充值