Tool CRC8 實現基礎與原理解析

2021-09-10 09:22:35 字數 2454 閱讀 2103

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上,是乙個快速但單位面積較大的元件,而單...