资源简介
用表驱动法来实现CRC8、CRC16、CRC32的数据校验,程序简洁,通俗易懂
代码片段和文件信息
#include “crc.h“
//计算机存储最小单位是字节存储顺序(小端模式)为低位字节在前高位在后
#define MSB_MODE 1 //大端模式
#define LSB_MODE 0
static void _InvertU8(uint8_t *dBuf uint8_t *srcBuf);
static void _InvertU16(uint16_t *dBuf uint16_t *srcBuf);
static void _InvertU32(uint32_t *dBuf uint32_t *srcBuf);
typedef bool (*pFunc)();
typedef struct{
uint16_t initVal;
uint16_t POLY;
uint16_t sub;
uint8_t bits;
char *funcName;
}crc16_Table_TypeDef;
static const crc16_Table_TypeDef CRC16_Table[] = {
{0x0000 0x1021 0x0000 LSB_MODE “CRC16_CCITT“}
{0xFFFF 0x1021 0x0000 MSB_MODE “CRC16_CCITT_FLASE“}
{0x0000 0x1021 0x0000 MSB_MODE “CRC16_XMODEM“}
{0xFFFF 0x1021 0xFFFF LSB_MODE “CRC16_X25“}
{0xFFFF 0x8005 0x0000 LSB_MODE “CRC16_MODBUS“}
{0x0000 0x8005 0x0000 LSB_MODE “CRC16_IBM“}
{0x0000 0x8005 0xFFFF LSB_MODE “CRC16_MAXIM“}
{0xFFFF 0x8005 0xFFFF LSB_MODE “CRC16_USB“}
};
typedef struct{
uint8_t initVal;
uint8_t POLY;
uint8_t sub;
uint8_t bits;
char *funcName;
}crc8_Table_TypeDef;
static const crc8_Table_TypeDef CRC8_Table[] = {
{0x00 0x07 0x00 MSB_MODE “CRC8“}
{0x00 0x07 0x55 MSB_MODE “CRC8_ITU“}
{0xFF 0x07 0x00 LSB_MODE “CRC8_ROHC“}
{0x00 0x31 0x00 LSB_MODE “CRC8_MAXIM“}
};
typedef struct{
uint32_t initVal;
uint32_t POLY;
uint32_t sub;
uint8_t bits;
char *funcName;
}crc32_Table_TypeDef;
static const crc32_Table_TypeDef CRC32_Table[]={
{0xFFFFFFFF 0x04C11DB7 0xFFFFFFFF LSB_MODE “CRC32“}
{0xFFFFFFFF 0x04C11DB7 0x00000000 MSB_MODE “CRC32_MPEG-2“}
};
uint16_t calc_crc16(uint8_t Mode uint8_t *pMsg uint16_t Len){
// printf(“ %d \n“ sizeof(Table)/sizeof(funcTable_TypeDef));
if(Mode > sizeof(CRC16_Table)/sizeof(crc16_Table_TypeDef))
return 0;
uint16_t CRCin = CRC16_Table[Mode].initVal;
uint8_t tmp = 0;
printf(“CRC_Mode: %s\n“ CRC16_Table[Mode].funcName);
for(uint16_t i=0;i tmp = *(pMsg++);
if(CRC16_Table[Mode].bits == LSB_MODE){
_InvertU8(&tmp &tmp);
}
CRCin ^= (tmp << 8);
for(uint8_t j=0;j<8;j++){
if(CRCin & 0x8000){
CRCin = (CRCin << 1) ^ CRC16_Table[Mode].POLY;
}else{
CRCin = CRCin << 1;
}
}
}
if(CRC16_Table[Mode].bits == LSB_MODE){
_InvertU16(&CRCin &CRCin);
}
return (CRCin ^ CRC16_Table[Mode].sub);
}
uint8_t calc_crc8(uint8_t Mode uint8_t*pMsg uint16_t Len){
if(Mode > sizeof(CRC8_Table)/sizeof(crc8_Table_TypeDef))
return 0;
uint8_t CRCin = CRC8_Table[Mode].initVal;
uint8_t tmp = 0;
printf(“CRC_Mode: %s\n“ CRC8_Table[Mode].funcName);
for(uint16_t i=0;i tmp = *(pMsg++);
if(CRC8_Table[Mode].bits == LSB_MODE){
_InvertU8(&tmp &tmp);
}
CRCin ^= tmp;
for(uint8_t j=0;j<8;j++){
if(CRCin & 0x80){
CRCin = (CRCin << 1) ^ CRC8_Table[Mode].POLY;
}else{
CRCin <<= 1;
}
}
}
if(CRC8_Table[Mode].bi
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 143 2019-03-15 16:24 readme.url
文件 357 2019-03-15 14:23 crc.h
文件 4580 2019-03-15 15:04 crc.c
- 上一篇:国际象棋代码实现
- 下一篇:MFC实现完整GoBang五子棋
相关资源
- crc16/32计算(crc16_32.c)
- VS2015 MFC 编写 常见的CRC校验,CRC4CRC
- C语言CRC32校验
- crc8的校验算法(c语言)
- CRC32校验程序源代码( C++)
- CRC32和CRC16校验程序C++中用DLL实现
- Verilog C语言 实现CRC16校验 高低字节分
- 常用数据校验源代码CRC8 CRC16 和校验
- CRC32算法(FPGA和C语言)
- crc32源代码32位crc校验码生成程序源代
- 最全CRC16计算代码(包含直接计算和查
- 支持自动回复CRC16计算的串口调试助手
- crc16几种标准校验算法及c语言代码(
- C语言实现直接计算CRC32功能
-
ja
vasc ript实现的CRC16源码非查表法
评论
共有 条评论