码迷,mamicode.com
首页 > 其他好文 > 详细

CRC校验的实现

时间:2015-04-09 21:30:26      阅读:120      评论:0      收藏:0      [点我收藏+]

标签:

【好长时间没更blog了::>_<::】

 

计算机网络课学习了CRC校(jiao)验的基本原理,不过课上学的那点东西只够做考试题的= =,于是想试试写一个对文件CRC校验的小程序

 

先来回顾下CRC校验的最基本原理:

核心思想:其实和hash很像。。。就是mod

设M是源文件,G是校验用的一串数(由CRC标准指定)

首先将M通过加校验变成N,以满足N mod G==0    (其中mod就是课本上那个模二不进位除法)

然后将N通过网络发送出去,在destination收到数据包Q

destination收到之后也要校验一下:若Q mod G==0,说明文件没错,否则说明有错

当然这种方法也会存在漏检的情况(比如N=Q+k*G的时候也被accept了,但实际上是有错的)。

选择合适的G可以降低漏检率(就像hash的时候除数要选择大质数一样)。

 

基本的CRC算法就是这样:

设G有r bit

STEP1:在M的末尾补r-1个0,变成XrM

STEP2:进行模二不进位除法(其实就是把竖式除法里的减换成了xor)

     [XrM] mod [G]  ,取余数remainder

STEP3:令N=XrM-remainder,

     得到的N就是加好校验的数据包。直接send出去就可以了

在上面这个过程中,remainder就是CRC校验码

其中模二不进位除法的详细过程:

技术分享

程序实现:

for data中的当前位=15→0
  tr=register的最高位
  register左移一位
  将data中当前位插到register的最低位中
  如果tr为1:
    register=register XOR poly

技术分享
 1 #   Load the register with zero bits.
 2 #   Augment the message by appending W zero bits to the end of it.
 3 #   While (more message bits)
 4 #      Begin
 5 #      Shift the register left by one bit, reading the next bit of the
 6 #         augmented message into register bit position 0.
 7 #      If (a 1 bit popped out of the register during step 3)
 8 #         Register = Register XOR Poly.
 9 #      End
10 #   The register now contains the remainder.
11 
12 data=0x35b
13 poly=0x13
14 dbit=16
15 pbit=5
16 regi=0x0
17 
18 data=data<<(pbit-1)
19 dpoint=dbit-1
20 while(dpoint>=0):
21     tr=(regi>>(pbit-2))&0x1         #MSB in register
22     regi=regi<<1
23     tmp=(data>>dpoint)&0x1                      
24     regi+=tmp
25     if (tr==1):
26         regi=regi^poly
27     dpoint=dpoint-1
28 
29 print(regi)
View Code

上述方法是最裸的方法。。。一bit一bit地处理。

但实际应用中如果真这么做那也太慢了= =

 

CRC校验的实现

标签:

原文地址:http://www.cnblogs.com/pdev/p/4411368.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!