/**Info * Name: CRC-16/CCITT x16+x12+x5+1 * Width: 16 * Poly: 0x1021 * Init: 0x0000 * Refin: True * Refout: True * Xorout: 0x0000 * Alias: CRC-CCITT,CRC-16/CCITT-TRUE,CRC-16/KERMIT */ #if 0 unsigned short CRC16_CCITT(unsigned char *data, unsigned int datalen) { unsigned short wCRCin = 0x0000; unsigned short wCPoly = 0x1021; unsigned char wChar = 0; while (datalen--) { wChar = *(data++); InvertUint8(&wChar,&wChar); wCRCin ^= (wChar << 8); for(int i = 0;i < 8;i++) { if(wCRCin & 0x8000) wCRCin = (wCRCin << 1) ^ wCPoly; else wCRCin = wCRCin << 1; } } InvertUint16(&wCRCin,&wCRCin); return (wCRCin); } #else //这里为了效率,我们不需要将所有Refin和refout为true的输入输出数据移位转换 //只需要将poly二项式转换后,运算时将左移变为右移 unsigned short CRC16_CCITT(unsigned char *data, unsigned int datalen) { unsigned short wCRCin = 0x0000; unsigned short wCPoly = 0x1021; unsigned char wChar = 0; InvertUint16(&wCPoly,&wCPoly); while (datalen--) { wCRCin ^= *(data++); for(int i = 0;i < 8;i++) { if(wCRCin & 0x01) wCRCin = (wCRCin >> 1) ^ wCPoly; else wCRCin = wCRCin >> 1; } } return (wCRCin); } #endif /**Info * Name: CRC-16/CCITT-FALSE x16+x12+x5+1 * Width: 16 * Poly: 0x1021 * Init: 0xFFFF * Refin: False * Refout: False * Xorout: 0x0000 * Note: */ unsigned short CRC16_CCITT_FALSE(unsigned char *data, unsigned int datalen) { unsigned short wCRCin = 0xFFFF; unsigned short wCPoly = 0x1021; while (datalen--) { wCRCin ^= *(data++) << 8; for(int i = 0;i < 8;i++) { if(wCRCin & 0x8000) wCRCin = (wCRCin << 1) ^ wCPoly; else wCRCin = wCRCin << 1; } } return (wCRCin); } /**Info * Name: CRC-16/XMODEM x16+x12+x5+1 * Width: 16 * Poly: 0x1021 * Init: 0x0000 * Refin: False * Refout: False * Xorout: 0x0000 * Alias: CRC-16/ZMODEM,CRC-16/ACORN */ unsigned short CRC16_XMODEM(unsigned char *data, unsigned int datalen) { unsigned short wCRCin = 0x0000; unsigned short wCPoly = 0x1021; while (datalen--) { wCRCin ^= (*(data++) << 8); for(int i = 0;i < 8;i++) { if(wCRCin & 0x8000) wCRCin = (wCRCin << 1) ^ wCPoly; else wCRCin = wCRCin << 1; } } return (wCRCin); } /**Info * Name: CRC-16/X25 x16+x12+x5+1 * Width: 16 * Poly: 0x1021 * Init: 0xFFFF * Refin: True * Refout: True * Xorout: 0XFFFF * Note: */ #if 0 unsigned short CRC16_X25(unsigned char *data, unsigned int datalen) { unsigned short wCRCin = 0xFFFF; unsigned short wCPoly = 0x1021; unsigned char wChar = 0; while (datalen--) { wChar = *(data++); InvertUint8(&wChar,&wChar); wCRCin ^= (wChar << 8); for(int i = 0;i < 8;i++) { if(wCRCin & 0x8000) wCRCin = (wCRCin << 1) ^ wCPoly; else wCRCin = wCRCin << 1; } } InvertUint16(&wCRCin,&wCRCin); return (wCRCin^0xFFFF); } #else unsigned short CRC16_X25(unsigned char *data, unsigned int datalen) { unsigned short wCRCin = 0xFFFF; unsigned short wCPoly = 0x1021; InvertUint16(&wCPoly,&wCPoly); while (datalen--) { wCRCin ^= *(data++); for(int i = 0;i < 8;i++) { if(wCRCin & 0x01) wCRCin = (wCRCin >> 1) ^ wCPoly; else wCRCin = wCRCin >> 1; } } return (wCRCin^0xFFFF); } #endif /**Info * Name: CRC-16/MODBUS x16+x15+x2+1 * Width: 16 * Poly: 0x8005 * Init: 0xFFFF * Refin: True * Refout: True * Xorout: 0x0000 * Note: */ #if 0 unsigned short CRC16_MODBUS(unsigned char *data, unsigned int datalen) { unsigned short wCRCin = 0xFFFF; unsigned short wCPoly = 0x8005; unsigned char wChar = 0; while (datalen--) { wChar = *(data++); InvertUint8(&wChar,&wChar); wCRCin ^= (wChar << 8); for(int i = 0;i < 8;i++) { if(wCRCin & 0x8000) wCRCin = (wCRCin << 1) ^ wCPoly; else wCRCin = wCRCin << 1; } } InvertUint16(&wCRCin,&wCRCin); return (wCRCin); } #else unsigned short CRC16_MODBUS(unsigned char *data, unsigned int datalen) { unsigned short wCRCin = 0xFFFF; unsigned short wCPoly = 0x8005; InvertUint16(&wCPoly,&wCPoly); while (datalen--) { wCRCin ^= *(data++); for(int i = 0;i < 8;i++) { if(wCRCin & 0x01) wCRCin = (wCRCin >> 1) ^ wCPoly; else wCRCin = wCRCin >> 1; } } return (wCRCin); } #endif /**Info * Name: CRC-16/IBM x16+x15+x2+1 * Width: 16 * Poly: 0x8005 * Init: 0x0000 * Refin: True * Refout: True * Xorout: 0x0000 * Alias: CRC-16,CRC-16/ARC,CRC-16/LHA */ #if 0 unsigned short CRC16_IBM(unsigned char *data, unsigned int datalen) { unsigned short wCRCin = 0x0000; unsigned short wCPoly = 0x8005; unsigned char wChar = 0; while (datalen--) { wChar = *(data++); InvertUint8(&wChar,&wChar); wCRCin ^= (wChar << 8); for(int i = 0;i < 8;i++) { if(wCRCin & 0x8000) wCRCin = (wCRCin << 1) ^ wCPoly; else wCRCin = wCRCin << 1; } } InvertUint16(&wCRCin,&wCRCin); return (wCRCin); } #else unsigned short CRC16_IBM(unsigned char *data, unsigned int datalen) { unsigned short wCRCin = 0x0000; unsigned short wCPoly = 0x8005; InvertUint16(&wCPoly,&wCPoly); while (datalen--) { wCRCin ^= *(data++); for(int i = 0;i < 8;i++) { if(wCRCin & 0x01) wCRCin = (wCRCin >> 1) ^ wCPoly; else wCRCin = wCRCin >> 1; } } return (wCRCin); } #endif /**Info * Name: CRC-16/MAXIM x16+x15+x2+1 * Width: 16 * Poly: 0x8005 * Init: 0x0000 * Refin: True * Refout: True * Xorout: 0xFFFF * Note: */ #if 0 unsigned short CRC16_MAXIM(unsigned char *data, unsigned int datalen) { unsigned short wCRCin = 0x0000; unsigned short wCPoly = 0x8005; unsigned char wChar = 0; while (datalen--) { wChar = *(data++); InvertUint8(&wChar,&wChar); wCRCin ^= (wChar << 8); for(int i = 0;i < 8;i++) { if(wCRCin & 0x8000) wCRCin = (wCRCin << 1) ^ wCPoly; else wCRCin = wCRCin << 1; } } InvertUint16(&wCRCin,&wCRCin); return (wCRCin^0xFFFF); } #else unsigned short CRC16_MAXIM(unsigned char *data, unsigned int datalen) { unsigned short wCRCin = 0x0000; unsigned short wCPoly = 0x8005; InvertUint16(&wCPoly,&wCPoly); while (datalen--) { wCRCin ^= *(data++); for(int i = 0;i < 8;i++) { if(wCRCin & 0x01) wCRCin = (wCRCin >> 1) ^ wCPoly; else wCRCin = wCRCin >> 1; } } return (wCRCin^0xFFFF); } #endif /**Info * Name: CRC-16/USB x16+x15+x2+1 * Width: 16 * Poly: 0x8005 * Init: 0xFFFF * Refin: True * Refout: True * Xorout: 0xFFFF * Note: */ #if 0 unsigned short CRC16_USB(unsigned char *data, unsigned int datalen) { unsigned short wCRCin = 0xFFFF; unsigned short wCPoly = 0x8005; unsigned char wChar = 0; while (datalen--) { wChar = *(data++); InvertUint8(&wChar,&wChar); wCRCin ^= (wChar << 8); for(int i = 0;i < 8;i++) { if(wCRCin & 0x8000) wCRCin = (wCRCin << 1) ^ wCPoly; else wCRCin = wCRCin << 1; } } InvertUint16(&wCRCin,&wCRCin); return (wCRCin^0xFFFF); } #else unsigned short CRC16_USB(unsigned char *data, unsigned int datalen) { unsigned short wCRCin = 0xFFFF; unsigned short wCPoly = 0x8005; InvertUint16(&wCPoly,&wCPoly); while (datalen--) { wCRCin ^= *(data++); for(int i = 0;i < 8;i++) { if(wCRCin & 0x01) wCRCin = (wCRCin >> 1) ^ wCPoly; else wCRCin = wCRCin >> 1; } } return (wCRCin^0xFFFF); } #endif /**Info * Name: CRC-16/DNP x16+x13+x12+x11+x10+x8+x6+x5+x2+1 * Width: 16 * Poly: 0x3D65 * Init: 0x0000 * Refin: True * Refout: True * Xorout: 0xFFFF * Use: M-Bus,ect. */ #if 0 unsigned short CRC16_DNP(unsigned char *data, unsigned int datalen) { unsigned short wCRCin = 0x0000; unsigned short wCPoly = 0x3D65; unsigned char wChar = 0; while (datalen--) { wChar = *(data++); InvertUint8(&wChar,&wChar); wCRCin ^= (wChar << 8); for(int i = 0;i < 8;i++) { if(wCRCin & 0x8000) wCRCin = (wCRCin << 1) ^ wCPoly; else wCRCin = wCRCin << 1; } } InvertUint16(&wCRCin,&wCRCin); return (wCRCin^0xFFFF) ; } #else unsigned short CRC16_DNP(unsigned char *data, unsigned int datalen) { unsigned short wCRCin = 0x0000; unsigned short wCPoly = 0x3D65; InvertUint16(&wCPoly,&wCPoly); while (datalen--) { wCRCin ^= *(data++); for(int i = 0;i < 8;i++) { if(wCRCin & 0x01) wCRCin = (wCRCin >> 1) ^ wCPoly; else wCRCin = (wCRCin >> 1); } } return (wCRCin^0xFFFF); } #endif
版权声明:
本文来源网络,所有图片文章版权属于原作者,如有侵权,联系删除。
本文网址:https://www.mushiming.com/mjsbk/13653.html