crc16常見的標準有以下幾種,被用在各個規範中,其演算法原理基本一致,就是在資料的輸入和輸出有所差異,下邊把這些標準的差異列出,並給出c語言的演算法實現。
crc16_ccitt:多項式x16+x12+x5+1(0x1021),初始值0x0000,低位在前,高位在後,結果與0x0000異或
crc16_ccitt_false:多項式x16+x12+x5+1(0x1021),初始值0xffff,低位在後,高位在前,結果與0x0000異或
crc16_xmodem:多項式x16+x12+x5+1(0x1021),初始值0x0000,低位在後,高位在前,結果與0x0000異或
crc16_x25:多項式x16+x12+x5+1(0x1021),初始值0x0000,低位在前,高位在後,結果與0xffff異或
crc16_modbus:多項式x16+x15+x2+1(0x8005),初始值0xffff,低位在前,高位在後,結果與0x0000異或
crc16_ibm:多項式x16+x15+x2+1(0x8005),初始值0x0000,低位在前,高位在後,結果與0x0000異或
crc16_maxim:多項式x16+x15+x2+1(0x8005),初始值0x0000,低位在前,高位在後,結果與0xffff異或
crc16_usb:多項式x16+x15+x2+1(0x8005),初始值0xffff,低位在前,高位在後,結果與0xffff異或
模式多項式
初始值資料位序
結果處理
crc16_ccitt
x16+x12+x5+1(0x1021)
0x0000
低位在前,高位在後
與0x0000異或
crc16_ccitt_false
x16+x12+x5+1(0x1021)
0xffff
低位在後,高位在前
與0x0000異或
crc16_xmodem
x16+x12+x5+1(0x1021)
0x0000
低位在後,高位在前
與0x0000異或
crc16_x25
x16+x12+x5+1(0x1021)
0x0000
低位在後,高位在前
與0xffff異或
crc16_ modbus
x16+x15+x2+1(0x8005)
0xffff
低位在前,高位在後
與0x0000異或
crc16_ ibm
x16+x15+x2+1(0x8005)
0x0000
低位在前,高位在後
與0x0000異或
crc16_ maxim
x16+x15+x2+1(0x8005)
0x0000
低位在前,高位在後
與0xffff異或
crc16_ usb
x16+x15+x2+1(0x8005)
0xffff
低位在前,高位在後
與0xffff異或
多項式產生:
如x16+x12+x5+1
x16表示第16位為1,x5表示第5位為1
(1 << 16) | (1 << 12) | (1 << 5) | (1) = 0x11021
但是crc16只取低16位,寫成16進製制數就是 0x1021
crc16的演算法原理:
1.根據crc16的標準選擇初值crcin的值。
2.將資料的第乙個位元組與crcin高8位異或。
3.判斷最高位,若該位為 0 左移一位,若為 1 左移一位再與多項式hex碼異或。
4.重複3直至8位全部移位計算結束。
5.重複將所有輸入資料操作完成以上步驟,所得16位數即16位crc校驗碼。
根據演算法原理與標準要求就能簡單的寫出具體程式:
unsigned short crc16_ccitt(unsigned char *puchmsg, unsigned int usdatalen)
} invertuint16(&wcrcin,&wcrcin);
return (wcrcin) ;
}unsigned short crc16_ccitt_false(unsigned char *puchmsg, unsigned int usdatalen)
} return (wcrcin) ;
}unsigned short crc16_xmodem(unsigned char *puchmsg, unsigned int usdatalen)
} return (wcrcin) ;
}unsigned short crc16_x25(unsigned char *puchmsg, unsigned int usdatalen)
} invertuint16(&wcrcin,&wcrcin);
return (wcrcin^0xffff) ;
}unsigned short crc16_modbus(unsigned char *puchmsg, unsigned int usdatalen)
} invertuint16(&wcrcin,&wcrcin);
return (wcrcin) ;
}unsigned short crc16_ibm(unsigned char *puchmsg, unsigned int usdatalen)
} invertuint16(&wcrcin,&wcrcin);
return (wcrcin) ;
}unsigned short crc16_maxim(unsigned char *puchmsg, unsigned int usdatalen)
} invertuint16(&wcrcin,&wcrcin);
return (wcrcin^0xffff) ;
}unsigned short crc16_usb(unsigned char *puchmsg, unsigned int usdatalen)
} invertuint16(&wcrcin,&wcrcin);
return (wcrcin^0xffff) ;
}
void invertuint8(unsigned char *dbuf,unsigned char *srcbuf)
dbuf[0] = tmp[0];
}void invertuint16(unsigned short *dbuf,unsigned short *srcbuf)
dbuf[0] = tmp[0];
}
具體驗證請使用這個工具,內含crc所有演算法的計算
crc計算器crc_calc
CRC16 演算法及c實現
標準crc生成多項式如下表 名稱 生成多項式 簡記式 標準引用 crc 4 x4 x 1 3 itu g.704 crc 8 x8 x5 x4 1 0x31 crc 8 x8 x2 x1 1 0x07 crc 8 x8 x6 x4 x3 x2 x1 0x5e crc 12 x12 x11 x3 x ...
CRC16 校驗演算法
1 迴圈校驗碼 crc碼 是資料通訊領域中最常用的一種差錯校驗碼,其特徵是資訊字段和校驗欄位的長度可以任意選定。2 生成crc碼的基本原理 任意乙個由二進位制位串組成的 都可以和乙個係數僅為 0 和 1 取值的多項式一一對應。例如 1010111對應的多項式為x6 x4 x2 x 1,而多項式為x5...
java實現的CRC16演算法
crc 是先調入一值是全 1 的 16 位暫存器,然後呼叫一過程將訊息中連續的 8 位位元組各當前暫存器中的值進行處理。僅每個字元中的 8bit 資料對 crc 有效,起始位和停止位以及奇偶校驗位均無效。crc 校驗位元組的生成步驟如下 裝乙個 16 位暫存器,所有數字均為 1。取被校驗串的乙個位元...