1、crc8 標準生成多項式
crc-8 x8+x5+x4+1 0x31(0x131)
crc-8 x8+x2+x1+1 0x07(0x107)
crc-8 x8+x6+x4+x3+x2+x1 0x5e(0x15e)
注:由於多項式的最高為都為 1,並且在**的 crc8 計算中,最高位也是不使用的,所以在多項式記錄時都去掉了最高位。
2、 crc 校驗演算法
原理:
把需要校驗的資料與多項式進行迴圈異或(xor),但進行 xor 的方式與實際中資料傳輸時,與高位先傳或低位先傳有關。
對於資料高位先傳的方式:
xor 從資料的高位開始,稱為順序異或;
對於資料低位先傳的方式:
xor 從資料的低位開始,稱為反序異或。
兩種不同的異或方式,即使對應相同的多項式,計算出來的結果也是不一樣的。
示例:
下面以順序異或的例子說明一些計算的過程:
多項式:
x8+x5+x4+1(二進位制為:100110001)
計算乙個位元組:
0x11(二進位制為:00010001)
計算步驟:
a、因為採用順序異或,所以需要計算的資料左移8位,移位後資料為:0001 0001 0000 000
b、先進行高9bit異或(多項式為9bit),0001 0001 0000 0000,因為高 9bit 的最高 bit 為 0,不需要進行異或,同理,接下來的兩 bit 也是 0,也不需要進行進行異或。
這樣處理後資料為:1 0001 0000 0000
c、接下來最高位為 1,需要進行異或操作了
從上面的計算過程可以看到,多項式最高位為1,遇到需要異或資料最高位為1時,才進行異或計算,並且異或後,最高位就為0了,最高位為0,下次也不需要異或了,
這樣需要採用**計算的方式,就可以把最高位去掉,不需要異或,最後結果也是一樣的。
對於上面的計算過程,採用**實現的方式如下:
unsigned char cal_table_high_first(unsigned char value)
else
}return crc;
}
上面的**是計算乙個位元組資料的crc結果,如果是計算多個位元組的crc結果,也是比較簡單;
先計算第乙個位元組的crc結果,然後把第乙個位元組的crc結果與第二個位元組進行異或,異或後的值再進行一次crc計算就可以了,多個位元組也是反覆這過程就好。
如下為多個位元組的crc校驗**:
unsigned char crc_high_first(unsigned char *ptr, unsigned char len)
}return (crc);
}
上面的crc計算是純採用邏輯執行的方式,可以看到,需要的執行量也是不少的,每乙個位元組都需要進行8次判斷、移位、或異或操作。
可以採用查表法,大大減少計算量,先計算出0x00~0xff每乙個位元組的crc校驗結果,後面就可以通過表來查出每個位元組的crc結果,大大 減少計算量。
下面是乙個表生成程式:
(生成表對應多項式:0x31(多項式:x8+x5+x4+1,100110001))
void create_crc_table(void)
}
static const unsigned char crc_table =
;
採用查表法計算crc**如下:
unsigned char cal_crc_table(unsigned char *ptr, unsigned char len)
return (crc);
}
3、 反序異或的計算
反序異或與順序異或差異在資料先判斷最低位,並且資料是向右移的,並且多項式資料位需要高低位反轉一下。
多項式:
x8+x5+x4+1(二進位制為:100110001)
則計算乙個位元組的 crc 校驗**如下:
unsigned char cal_table_low_first(unsigned char value)
return crc;
}
至於多個位元組的crc校驗及crc資料表的生成,只要把單個位元組的計算方式替換一下順序的
計算方式。
所以,只要明確了crc校驗使用的多項式,高位先校驗還是低位先校驗,計算crc的初始值是什麼,那crc的計算就變得很簡單了。
refer:
焊接原理與基礎
前言 電弧的物理本質 兩電極之間要產生放電就必須具備兩個條件 一是必須有帶電粒子,二是在電極之間必須有一定強度的電場。帶電粒子的產生 電弧中的帶電粒子指的是電子,正離子和負離子。產生的過程為 中性原子的激勵,電離和電極電子的發射。激勵 電子沒有脫離束縛,但是從低能級狀態轉移到了高能級的現象。通過加熱...
Stream ResultSet實現原理與應用實踐
這篇我們來深入聊聊stream resultset的實現原理和應用實踐。原理解析 stream resultset的實現方式mysql官方文件中沒有說明,這裡我們只有自食其力閱讀原始碼了。首先和組內mysql大牛一起看了mysql select過程原始碼,這裡就不貼 了,直接說結論 mysql中沒有...
OverLay 原理與實現
overlay技術 分類 大體分為軟體overlay 硬體 本文主要介紹 軟體實現overlay。至於硬體實現的方式或者說策略,目前能找到的資源有限,且自己還沒有弄清楚,所以當前情況下暫不介紹。所謂overlay 即 實現 記憶體區域的重複利用。ram在soc上,是乙個快速但單位面積較大的元件,而單...