2018年07月21日 15:42:26 王大寶寶 閱讀數 1424算法
因爲網上的CRC16標準算法不少,在實現CRC16算法時網上都是不一樣的算法有不一樣的函數,我以爲這樣很不方便,因此本身實現了一個通用的CRC16算法:函數
/************************************************* Function: calculate_crc16 Description: 通用的16位CRC校驗算法 Input: wCRCin:CRC16算法的初始值 wCPoly:特徵多項式 wResultXOR:結果異或值 input_invert:輸入值是否反轉 ouput_invert:輸出值是否反轉 puchMsg:開始校驗的數據的起始地址 usDataLen:校驗的數據長度 Output: 無輸出 Return: 16位CRC校驗結果 Others: example:CRC-16/CCITT由本函數實現則填充參數以下: calculate_crc(0,0x1021,0,true,true,puchMsg,usDataLen) *************************************************/ quint16 calculate_crc16(quint16 wCRCin,quint16 wCPoly,quint16 wResultXOR,bool input_invert,bool ouput_invert,const char *puchMsg, int usDataLen) { quint8 wChar = 0; while (usDataLen--) { wChar = *(puchMsg++); if(input_invert)//輸入值反轉 { quint8 temp_char = wChar; wChar=0; for(int i=0;i<8;++i) { if(temp_char&0x01) wChar|=0x01<<(7-i); temp_char>>=1; } } wCRCin ^= (wChar << 8); for (int i = 0; i < 8; i++) { if (wCRCin & 0x8000) wCRCin = (wCRCin << 1) ^ wCPoly; else wCRCin = wCRCin << 1; } } if(ouput_invert) { quint16 temp_short = wCRCin; wCRCin=0; for(int i=0;i<16;++i) { if(temp_short&0x01) wCRCin|=0x01<<(15-i); temp_short>>=1; } } return (wCRCin^wResultXOR); }