USB說明書中列舉了兩種生成多項式(generator polynomials)即除數多項式:一種是針對令牌包(tokens)的x5+x2+1,另一種是針對數據包的x16+x15+x2+1,由於餘數要永遠比除數小一階的緣故,所以令牌(tokens)CRC是5bit組合,數據CRC是16bit組合。
兩種CRC計算方法一樣,步驟如下:
步驟一:創建被除數:
D(x) = xdF(x) + xkL(x);
其中D(x)是待創建的被除數多項式,d表示生成多項式即除數多項式的階數(令牌包爲5,數據包爲16),F(x)爲待檢驗的數據流(如令牌包檢驗中地址位和端口位組合的11位數據),是一個k-1階多項式,k爲數據流位數(如令牌包檢驗中k爲11),L(x)表示係數爲全1的d-1階多項式(如令牌包檢驗中L(x)爲x4+x3+x2+x+1)。
注意:F(x)必須是待檢驗的數據流由低位到高位順序排列的(由USB低位到高位發送順序決定)。如:對於addr 0x70, endpoint 4的CRC5,其F(x)流爲00001110010,算的時候用該數據流左移5位即得0000111001000000然後加上xkL(x)即1111100000000000得到D(x)。而對於數據包0x00 0x01 0x02 0x03的CRC16,其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-1)bit二進制餘數按位取反(即R(x)+L(x)運算),即可得到最終的CRC。