隨筆——USB的CRC算法

   

USB說明書中列舉了兩種生成多項式(generator polynomials)即除數多項式:一種是針對令牌包(tokens)的x5+x2+1,另一種是針對數據包的x16+x15+x2+1,由於餘數要永遠比除數小一階的緣故,所以令牌(tokensCRC5bit組合,數據CRC16bit組合。

兩種CRC計算方法一樣,步驟如下:

步驟一:創建被除數:

D(x) = xdF(x) + xkL(x)

其中D(x)是待創建的被除數多項式,d表示生成多項式即除數多項式的階數(令牌包爲5,數據包爲16),F(x)爲待檢驗的數據流(如令牌包檢驗中地址位和端口位組合的11位數據),是一個k-1階多項式,k爲數據流位數(如令牌包檢驗中k11),L(x)表示係數爲全1d-1階多項式(如令牌包檢驗中L(x)x4+x3+x2+x+1)。

注意:F(x)必須是待檢驗的數據流由低位到高位順序排列的(由USB低位到高位發送順序決定)。如:對於addr 0x70, endpoint 4CRC5,其F(x)流爲00001110010,算的時候用該數據流左移5位即得0000111001000000然後加上xkLx)即1111100000000000得到D(x)。而對於數據包0x00 0x01 0x02 0x03CRC16,其F(x)流爲00000000100000000100000011000000

步驟二:用生成多項式除“被除數”得到“餘數”:

因爲這裏算法是一個簡單的2模運算,不包含進位借位的,所以該除法可表示成簡單的異或運算加位移運算。如對於CRC5的校驗,D(x)是一個16bit二進制,生成多項式G(x)x5+x2+1,可表示成100101,是一個6bit二進制。除法步驟如下:

1)D(x)的高6位與G(x)異或運算;得到一個新的D'(x)

2)D'(x)左移一位,移掉MSB位,但右邊不進位,即此時剩餘15bit二進制,稱爲D''(x)

3)D''(x)的高6位再與G(x)異或運算,然後再左移... ...重複前兩步驟,直到D(x)LSB 

      位(最低位)也參與異或運算,此時得到一個4(d-1)多項式的餘數R(x)

步驟三:對餘數按位取反:

    將得到的(d-1bit二進制餘數按位取反(即R(x)+L(x)運算),即可得到最終的CRC

發佈了31 篇原創文章 · 獲贊 10 · 訪問量 12萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章