日誌 CRC終於搞成了

2021-04-13 22:34:55 字數 1050 閱讀 8949

今晚看了好久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...