CRC16常見幾個標準的演算法及C語言實現

2021-08-15 17:20:44 字數 3312 閱讀 9174

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。取被校驗串的乙個位元...