今晚看了好久crc,最後還有沒有很明白。但是做為乙個做工程的,有結果就好了。
我要用的不是標準的crc公式,是x8+1這個,呵呵。下面開始總結。
crc用到的主要是模2除法,開始看得一頭霧水,只有把這個弄清楚了,後來才有了思路。才知道crc的計算過程。(此處是重點,我費了很多勁兒理解,省去若干字。)不知道計算過程,程式是絕對不能看懂的。
還有這麼一句話:多項式的msb略去不記,因其只對商有影響而不影響餘數。 就是說對於crc-ccitt=x16+x12+x5+1,可以只用0x1021,bit16位的1不要了,只留下bit12、5、0。(參考一篇modbus的說明)
生成crc-16校驗位元組的步驟如下:
①裝如乙個16位暫存器,所有數字均為1。
②該16位暫存器的高位位元組與開始8位位元組進行「異或」運算。運算結果放入這個16位暫存器。
③把這個16暫存器向右移一位。
④若向右(標記位)移出的數字是1,則生成多項式1010000000000001和這個暫存器進行「異或」
運算;若向右移出的數字是0,則返回③。
⑤重複③和④,直至移出8位。
⑥另外8位與該十六位暫存器進行「異或」運算。
⑦重複③~⑥,直至該報文所有位元組均與16位暫存器進行「異或」運算,並移位8次。
⑧這個16位暫存器的內容即2位元組crc錯誤校驗,被加到報文的最高有效位。
下面是成功的程式:
unsigned short crc(unsigned char *addr, int num)
else}}
return crc8;
}另外這樣也行:
unsigned short crc(unsigned char *addr, int num)
else}}
return crc8;
}可能是因為我的x8+1只有一位的原因吧,或者什麼其他的原因,我已經不願意思考下去了。好累。注意:其中兩個關鍵的地方就是移位1.操作不同;2.生成多項式對應的位元組值不同。調整這兩個變數,我想,能實現不同生成多項式的crc演算法。
另外還有查表的方式,希望以後再用到,我可以很快的搞懂。
**
磚家 「IPV9」 美國沒有成功,中國搞成了
網際網路,已滲透到人們工作 生活的各個角落,然而你是否知道,掌控這張網路的 終極鑰匙 不在我國?在全球15臺最頂端的網域名稱根伺服器中,有10臺設定在美國,與之配套的網際網路協議也是美國專家制定的。面對這種局面,上海科研人員研發出了一種新的網際網路協議 ipv9。明年年初,以該協議為核心的網路系統將...
《Windows核心原理與實現》終於完成了
windows 核心原理與實現 終於完成了 經過將近兩年的努力,終於完成了 windows 核心原理與實現 一書。2008 年春天,我有了寫一本關於 windows 核心的書的想法,然後聯絡出版社並付諸實施。這就把兩年的業餘時間搭了進去,至少有一半的夜晚遲至 2點才睡覺。按原來的計畫,期望在 200...
《Windows核心原理與實現》終於完成了
windows 核心原理與實現 終於完成了 經過將近兩年的努力,終於完成了 windows 核心原理與實現 一書。2008 年春天,我有了寫一本關於 windows 核心的書的想法,然後聯絡出版社並付諸實施。這就把兩年的業餘時間搭了進去,至少有一半的夜晚遲至 2點才睡覺。按原來的計畫,期望在 200...