有一次,知乎上的同窗问我:“为何使用迅雷下载东西的时候,最后的百分之一老是那么慢呢?还有,为何传输文件的时候,到最后的那一块也是那么慢呢?” 一看这位同窗就是个善于发现之人,能成大事。 其实缘由很是简单,对于迅雷来讲,通常使用的是P2P(点对点)的传输方式,最后的百分之一时(也有多是下载中的每一个时刻),迅雷就把你做为了点对点中的一个点,让其余人从你这里下载资源,若是你下载完成了,那不就是不能明目张胆的这么干了吗,这个时候你只须要将任务暂停,而后从新开始,立刻就下载完了;还有一个缘由是迅雷正在进行文件的校验,这部分实际上是涉及到计算机网络的内容了,从此咱们会详细的讲这块的东西。 而对于文件传输的时候,最后的部分也会感受到慢(不多见),是由于计算机传输比特流的过程当中也会去校验文件,看看传过来的比特流是否发生错误。 因此,咱们今天的主题是“数据校验方法”。咱们讲两种校验方法,一种叫作“海明码(汉明码)校验法”,另一种是CRC(循环冗余)校验。这两种有着不一样的应用场景,下面就来开始正式的内容。bash
上面讲了,在数据传输的过程当中是须要进行信息的校验的——由于数据在传输过程当中有各类缘由(磁场、电流等)会致使数据出错,比特位从0变成1,或者由1变成0。这样就形成了数据出错,因此即时发并予以纠正,就显得尤其重要了,毕竟谁也不想获得错误的信息不是。微信
海明码由来已久,是理查德·海明于1950年提出的。 首先来讲下海明码的数字位:海明码的数字位分红校验位和数据位。那么,什么是数据位什么又是校验位呢?网络
1 0 1 1 0 1 0 0 1
复制代码
所谓的校验位,就是用于校验数据位是否正确的辅助数字;而数据位就是真实传输的二进制数。看上面的数字,共有9位,那么哪些是校验位,哪些又是数字位呢? 海明码规定,2^n-1(n=1,2,3,……)位就是校验位。因此上面的数字中:一、二、四、8……就是校验位。除了校验位剩下的就是数据位。 那么,如何肯定校验位的个数呢?其实有这样一个公式2^k >= n+k+1。n是须要校验的数据共有多少位,天然能够求出k的值,k就是校验位的个数。编码
不一样的校验位,负责校验的数据位各不相同。下面是校验规则: spa
图中没有给出的第C8则是负责校验八、九、十、十一、十二、1三、1四、1五、24……位。其实这也是有规律的,可是上面的这几位通常就够用了,因此感兴趣的同窗能够本身看一看究竟有啥规律。 此外,海明码采用的是奇偶校验的方式进行校验,所谓奇偶校验是啥呢?好比说C8负责校验的这几位,奇校验就是这几位再加上C8自己这些数中的1加起来的数量是奇数。同理偶校验就是1的个数加起来是偶数。这个就很好理解了。 接下来,咱们来实际作一个例子。计算机网络
乍看好像没啥思路,可是咱们能够凭着感受,从1的个数是奇数做为出发点。首先来肯定校验位的个数,由公式2^k >= n+k+1能够计算出校验位的个数为3,即一、二、4位,其他为则为真正的数据位1001,以下图所示: code
再由C1校验的是一、三、五、7位,则共有两个1,为了知足奇校验的条件,则C1=1。 C2的校验位为二、三、五、7位,则共有两个1,为了知足奇校验的条件,则C2=1。 C4的校验位为四、五、六、7位,则共有1个1,则C4=0. 因此,奇校验的海明码就是1110001。cdn
海明码存在的意义就是为了纠错,因此,他的重要意义在于纠错的过程。blog
这个题目复杂在若是有一位出错,那么颇有可能会形成C一、C二、C4校验位的1的个数均不是偶数,因此肯定起来比较麻烦,咱们来看看这到底是如何解决的。 咱们按照以前的校验位原则再列出一张表格: 资源
能够看到,在表格中,C一、C2校验位中的1的个数均为奇数,而C4中的1为偶数个,因此出错确定是在c一、c2的公共部分。因此肯定是第3位出错,则将第三位纠正为0,即原来传输的数据是0101。 以上就是海明码的所有内容,接下来介绍CRC循环冗余校验方法。
CRC通常用于磁盘上的数据校验。同时,CRC还应用在计算机网络数据传输过程当中的数据校验。 CRC是基于模2运算的校验码。 CRC码是由两部分组成,前部分是信息码,就是须要校验的信息,后部分是校验码,若是CRC码共长n个bit,信息码长k个bit,就称为(n,k)码。编码规则以下:
实际上,生成多项式是国际上制定的标准,有不少,下面举几个例子: x^16+ x^12+ x^5+一、x^16+ x^15+ x^2+一、 x^4+ x^3 +x^2+1。 上面的g(x)则还能够堪称二进制数,好比说x^4+ x^3 +x^2+1 (从左向右,取出系数)就是11101(由于x^1没有,则为0)。
先将110向左移动4位,则为1100000。用11101|1100000(模2运算),最终的结果就是1001,则传输码为110,1100000。
本文详细的介绍了海明码,另一种CRC校验实际上只是一笔带过,在计算机网络系列文章中咱们会详细介绍, 敬请期待。= 若是你喜欢个人文章,请帮忙点赞;若是你对本文内容存在疑问,请留言告诉我。您的点赞和留言是对原创做者的最大支持,感谢您的阅读。 此外,本人一直在寻找志同道合的小伙伴,一样如此的能够邮件联系我:roobtyan@outlook.com. 微信公众号:最高权限比特流。