From 3fc34e263091c0e10fcec90f4608296ffb10697d Mon Sep 17 00:00:00 2001 From: dengcy Date: Wed, 18 Dec 2024 06:17:03 +0000 Subject: [PATCH] =?UTF-8?q?=E4=B8=8A=E4=BC=A0=E6=96=87=E4=BB=B6=E8=87=B3?= =?UTF-8?q?=20/?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- crc_lib.c | 429 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ crc_lib.h | 47 ++++++ 2 files changed, 476 insertions(+) create mode 100644 crc_lib.c create mode 100644 crc_lib.h diff --git a/crc_lib.c b/crc_lib.c new file mode 100644 index 0000000..85bf3a4 --- /dev/null +++ b/crc_lib.c @@ -0,0 +1,429 @@ +#include "crc_lib.h" + +static uint8_t CRC_4_ITU(uint8_t *data, uint8_t len); +static uint8_t CRC_5_EPC(uint8_t *data, uint8_t len); +static uint8_t CRC_5_ITU(uint8_t *data, uint8_t len); +static uint8_t CRC_5_USB(uint8_t *data, uint8_t len); +static uint8_t CRC_6_ITU(uint8_t *data, uint8_t len); +static uint8_t CRC_7_MMC(uint8_t *data, uint8_t len); +static uint8_t CRC_8(uint8_t *data, uint8_t len); +static uint8_t CRC_8_ITU(uint8_t *data, uint8_t len); +static uint8_t CRCC_8_ROHC(uint8_t *data, uint8_t len); +static uint8_t CRC_8_MAXIM(uint8_t *data, uint8_t len); +static uint16_t CRC_16_IBM(uint8_t *data, uint8_t len); +static uint16_t CRC_16_MAXIM(uint8_t *data, uint8_t len); +static uint16_t CRC_16_USB(uint8_t *data, uint8_t len); +static uint16_t CRC_16_MODBUS(uint8_t *data, uint8_t len); +static uint16_t CRC_16_CCITT(uint8_t *data, uint8_t len); +static uint16_t CRC_16_CCITT_FALSE(uint8_t *data, uint8_t len); +static uint16_t CRC_16_X25(uint8_t *data, uint8_t len); +static uint16_t CRC_16_XMODEM(uint8_t *data, uint8_t len); +static uint16_t CRC_16_DNP(uint8_t *data, uint8_t len); +static uint32_t CRC_32(uint8_t *data, uint8_t len); +static uint32_t CRC_32_MPEG_2(uint8_t *data, uint8_t len); + +FuncionTable crc_list = { + .CRC_4_ITU = CRC_4_ITU, + .CRC_5_EPC = CRC_5_EPC, + .CRC_5_ITU = CRC_5_ITU, + .CRC_5_USB = CRC_5_USB, + .CRC_6_ITU = CRC_6_ITU, + .CRC_7_MMC = CRC_7_MMC, + .CRC_8 = CRC_8, + .CRC_8_ITU = CRC_8_ITU, + .CRCC_8_ROHC = CRCC_8_ROHC, + .CRC_8_MAXIM = CRC_8_MAXIM, + .CRC_16_IBM = CRC_16_IBM, + .CRC_16_MAXIM = CRC_16_MAXIM, + .CRC_16_USB = CRC_16_USB, + .CRC_16_MODBUS = CRC_16_MODBUS, + .CRC_16_CCITT = CRC_16_CCITT, + .CRC_16_CCITT_FALSE = CRC_16_CCITT_FALSE, + .CRC_16_X25 = CRC_16_X25, + .CRC_16_XMODEM = CRC_16_XMODEM, + .CRC_16_DNP = CRC_16_DNP, + .CRC_32 = CRC_32, + .CRC_32_MPEG_2 = CRC_32_MPEG_2, +}; + +static uint8_t CRC_4_ITU(uint8_t *data, uint8_t len) +{ + uint8_t i; + uint8_t crc = 0; + while(len--) + { + crc ^= *data++; + for (i = 0; i < 8; ++i) + { + if (crc & 1) + crc = (crc >> 1) ^ 0x0C; + else + crc = (crc >> 1); + } + } + return crc & 0x0F; +} + +static uint8_t CRC_5_EPC(uint8_t *data, uint8_t len) +{ + uint8_t i; + uint8_t crc = 0x48; + while(len--) + { + crc ^= *data++; + for ( i = 0; i < 8; i++ ) + { + if ( crc & 0x80 ) + crc = (crc << 1) ^ 0x48; + else + crc <<= 1; + } + } + return (crc >> 3) & 0x1F; +} + +static uint8_t CRC_5_ITU(uint8_t *data, uint8_t len) +{ + uint8_t i; + uint8_t crc = 0; + while(len--) + { + crc ^= *data++; + for (i = 0; i < 8; ++i) + { + if (crc & 1) + crc = (crc >> 1) ^ 0x15; + else + crc = (crc >> 1); + } + } + return crc & 0x1F; +} + +static uint8_t CRC_5_USB(uint8_t *data, uint8_t len) +{ + uint8_t i; + uint8_t crc = 0x1F; + while(len--) + { + crc ^= *data++; + for (i = 0; i < 8; ++i) + { + if (crc & 1) + crc = (crc >> 1) ^ 0x14; + else + crc = (crc >> 1); + } + } + return crc ^ 0x1F; +} + +static uint8_t CRC_6_ITU(uint8_t *data, uint8_t len) +{ + uint8_t i; + uint8_t crc = 0; + while(len--) + { + crc ^= *data++; + for (i = 0; i < 8; ++i) + { + if (crc & 1) + crc = (crc >> 1) ^ 0x30; + else + crc = (crc >> 1); + } + } + return crc & 0x3F; +} + +static uint8_t CRC_7_MMC(uint8_t *data, uint8_t len) +{ + uint8_t i; + uint8_t crc = 0; + while(len--) + { + crc ^= *data++; + for ( i = 0; i < 8; i++ ) + { + if ( crc & 0x80 ) + crc = (crc << 1) ^ 0x12; + else + crc <<= 1; + } + } + return (crc >> 1) & 0x7F; +} + +static uint8_t CRC_8(uint8_t *data, uint8_t len) +{ + uint8_t i; + uint8_t crc = 0; + while(len--) + { + crc ^= *data++; + for ( i = 0; i < 8; i++ ) + { + if ( crc & 0x80 ) + crc = (crc << 1) ^ 0x07; + else + crc <<= 1; + } + } + return crc; +} + +static uint8_t CRC_8_ITU(uint8_t *data, uint8_t len) +{ + uint8_t i; + uint8_t crc = 0; + while(len--) + { + crc ^= *data++; + for ( i = 0; i < 8; i++ ) + { + if ( crc & 0x80 ) + crc = (crc << 1) ^ 0x07; + else + crc <<= 1; + } + } + return crc ^ 0x55; +} + +static uint8_t CRCC_8_ROHC(uint8_t *data, uint8_t len) +{ + uint8_t i; + uint8_t crc = 0xFF; + while(len--) + { + crc ^= *data++; + for (i = 0; i < 8; ++i) + { + if (crc & 1) + crc = (crc >> 1) ^ 0xE0; + else + crc = (crc >> 1); + } + } + return crc; +} + +static uint8_t CRC_8_MAXIM(uint8_t *data, uint8_t len) +{ + uint8_t i; + uint8_t crc = 0; + while(len--) + { + crc ^= *data++; + for (i = 0; i < 8; i++) + { + if (crc & 1) + crc = (crc >> 1) ^ 0x8C; + else + crc >>= 1; + } + } + return crc; +} + +static uint16_t CRC_16_IBM(uint8_t *data, uint8_t len) +{ + uint8_t i; + uint16_t crc = 0; + while(len--) + { + crc ^= *data++; + for (i = 0; i < 8; ++i) + { + if (crc & 1) + crc = (crc >> 1) ^ 0xA001; + else + crc = (crc >> 1); + } + } + return crc; +} + +static uint16_t CRC_16_MAXIM(uint8_t *data, uint8_t len) +{ + uint8_t i; + uint16_t crc = 0; + while(len--) + { + crc ^= *data++; + for (i = 0; i < 8; ++i) + { + if (crc & 1) + crc = (crc >> 1) ^ 0xA001; + else + crc = (crc >> 1); + } + } + return ~crc; +} + +static uint16_t CRC_16_USB(uint8_t *data, uint8_t len) +{ + uint8_t i; + uint16_t crc = 0xffff; + while(len--) + { + crc ^= *data++; + for (i = 0; i < 8; ++i) + { + if (crc & 1) + crc = (crc >> 1) ^ 0xA001; + else + crc = (crc >> 1); + } + } + return ~crc; +} + +static uint16_t CRC_16_MODBUS(uint8_t *data, uint8_t len) +{ + uint16_t crc = 0xFFFF; + uint8_t i, j; + for (j=0; j < len; j++) + { + crc=crc ^* data++; + for (i = 0; i < 8; i++) + { + if((crc & 0x0001) > 0) + { + crc = crc >> 1; + crc = crc ^ 0xa001; + }else + { + crc = crc >> 1; + } + } + } + return crc; +} + +static uint16_t CRC_16_CCITT(uint8_t *data, uint8_t len) +{ + uint8_t i; + uint16_t crc = 0; + while(len--) + { + crc ^= *data++; + for (i = 0; i < 8; ++i) + { + if (crc & 1) + crc = (crc >> 1) ^ 0x8408; + else + crc = (crc >> 1); + } + } + return crc; +} + +static uint16_t CRC_16_CCITT_FALSE(uint8_t *data, uint8_t len) +{ + uint8_t i; + uint16_t crc = 0xffff; + while(len--) + { + crc ^= (uint16_t)(*data++) << 8; + for (i = 0; i < 8; ++i) + { + if ( crc & 0x8000 ) + crc = (crc << 1) ^ 0x1021; + else + crc <<= 1; + } + } + return crc; +} + +static uint16_t CRC_16_X25(uint8_t *data, uint8_t len) +{ + uint8_t i; + uint16_t crc = 0xffff; + while(len--) + { + crc ^= *data++; + for (i = 0; i < 8; ++i) + { + if (crc & 1) + crc = (crc >> 1) ^ 0x8408; + else + crc = (crc >> 1); + } + } + return ~crc; +} + +static uint16_t CRC_16_XMODEM(uint8_t *data, uint8_t len) +{ + uint8_t i; + uint16_t crc = 0; + while(len--) + { + crc ^= (uint16_t)(*data++) << 8; + for (i = 0; i < 8; ++i) + { + if ( crc & 0x8000 ) + crc = (crc << 1) ^ 0x1021; + else + crc <<= 1; + } + } + return crc; +} + +static uint16_t CRC_16_DNP(uint8_t *data, uint8_t len) +{ + uint8_t i; + uint16_t crc = 0; + while(len--) + { + crc ^= *data++; + for (i = 0; i < 8; ++i) + { + if (crc & 1) + crc = (crc >> 1) ^ 0xA6BC; + else + crc = (crc >> 1); + } + } + return ~crc; +} + +static uint32_t CRC_32(uint8_t *data, uint8_t len) +{ + uint8_t i; + uint32_t crc = 0xffffffff; + while(len--) + { + crc ^= *data++; + for (i = 0; i < 8; ++i) + { + if (crc & 1) + crc = (crc >> 1) ^ 0xEDB88320; + else + crc = (crc >> 1); + } + } + return ~crc; +} + +static uint32_t CRC_32_MPEG_2(uint8_t *data, uint8_t len) +{ + uint8_t i; + uint32_t crc = 0xffffffff; + while(len--) + { + crc ^= (uint32_t)(*data++) << 24; + for (i = 0; i < 8; ++i) + { + if ( crc & 0x80000000 ) + crc = (crc << 1) ^ 0x04C11DB7; + else + crc <<= 1; + } + } + return crc; +} \ No newline at end of file diff --git a/crc_lib.h b/crc_lib.h new file mode 100644 index 0000000..fc9fe91 --- /dev/null +++ b/crc_lib.h @@ -0,0 +1,47 @@ +/* + * + * 使用示例:crc_list.CRC_4_ITU(data, len); + * data为数据数组,len为数据长度 + * + */ +#ifndef __CRC_LIB_H__ +#define __CRC_LIB_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "stdint.h" + +typedef struct { + uint8_t (*CRC_4_ITU)(uint8_t *data, uint8_t len); + uint8_t (*CRC_5_EPC)(uint8_t *data, uint8_t len); + uint8_t (*CRC_5_ITU)(uint8_t *data, uint8_t len); + uint8_t (*CRC_5_USB)(uint8_t *data, uint8_t len); + uint8_t (*CRC_6_ITU)(uint8_t *data, uint8_t len); + uint8_t (*CRC_7_MMC)(uint8_t *data, uint8_t len); + uint8_t (*CRC_8)(uint8_t *data, uint8_t len); + uint8_t (*CRC_8_ITU)(uint8_t *data, uint8_t len); + uint8_t (*CRCC_8_ROHC)(uint8_t *data, uint8_t len); + uint8_t (*CRC_8_MAXIM)(uint8_t *data, uint8_t len); + uint16_t (*CRC_16_IBM)(uint8_t *data, uint8_t len); + uint16_t (*CRC_16_MAXIM)(uint8_t *data, uint8_t len); + uint16_t (*CRC_16_USB)(uint8_t *data, uint8_t len); + uint16_t (*CRC_16_MODBUS)(uint8_t *data, uint8_t len); + uint16_t (*CRC_16_CCITT)(uint8_t *data, uint8_t len); + uint16_t (*CRC_16_CCITT_FALSE)(uint8_t *data, uint8_t len); + uint16_t (*CRC_16_X25)(uint8_t *data, uint8_t len); + uint16_t (*CRC_16_XMODEM)(uint8_t *data, uint8_t len); + uint16_t (*CRC_16_DNP)(uint8_t *data, uint8_t len); + uint32_t (*CRC_32)(uint8_t *data, uint8_t len); + uint32_t (*CRC_32_MPEG_2)(uint8_t *data, uint8_t len); +} FuncionTable; +extern FuncionTable crc_list; + +#ifdef __cplusplus +} +#endif + +#endif /* __CRC_LIB_H__ */ + +