标签:
【好长时间没更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)
上述方法是最裸的方法。。。一bit一bit地处理。
但实际应用中如果真这么做那也太慢了= =
标签:
原文地址:http://www.cnblogs.com/pdev/p/4411368.html