C语言CRC通用模块代码

我这几天看了下CRC具体校验原理,我看网上都没有一个通用的CRC库,都是一个函数写一种校验方式的那种,以下代码是随手写的一个通用的CRC软件模块, 支持最小单位字节的输入,有问题大家一起讨论。移植时需要修改的点可能是数据类型的重新定义。

/******************************************************************************************
源文件名: crc.h
文件描述: CRC校验
作者信息: Bachelor Tse
创建日期: 2024-04-01
最新版本: 0.0.1
修改记录: 
*****************************************************************************/
#ifndef __CRC_H
#define __CRC_H#include "BSPTypeDef.h"typedef enum
{CRC4_ITU,               /*CRC-4/ITU*/CRC5_EPC,               /*CRC-5/EPC*/CRC5_ITU,               /*CRC-5/ITU*/                CRC5_USB,               /*CRC-5/USB*/CRC6_ITU,               /*CRC-6/ITU*/CRC7_MMC,               /*CRC-7/MMC*/CRC8,                   /*CRC-8*/      CRC8_ITU,               /*CRC-8/ITU*/CRC8_ROHC,              /*CRC-8/ROHC*/CRC8_MAXIM,             /*CRC-8/MAXIM*/CRC16_IBM,              /*CRC-16/ITU*/CRC16_MAXIM,            /*CRC-16/MAXIM*/CRC16_USB,              /*CRC-16/USB*/CRC16_MODBUS,           /*CRC-16/MODBUS*/        CRC16_CCITT,            /*CRC-16/CCITT*/CRC16_CCITT_FALSE,      /*CRC-16/CCITT_FALSE*/CRC16_X25,              /*CRC-16/X25*/CRC16_XMODEM,           /*CRC-16/XMODEM*/CRC16_DNP,              /*CRC-16/DNP*/CRC32,                  /*CRC-32*/CRC32_MPEG2,            /*CRC-32/MPEG-2*/CRC_TYPE_NUM,           /*CRC校验方式数量*/
} E_CRC_TYPE;typedef struct
{E_CRC_TYPE Crc_Type;    /*CRC校验方式*/uint8 Crc_Width;        /*CRC校验宽度位数*/    uint8 Crc_InputInvert;  /*CRC校验输入反转*/ uint8 Crc_OutputInvert; /*CRC校验输出反转*/ uint32 Crc_Poly;        /*CRC校验多项式*/ uint32 Crc_Init_Value;  /*CRC校验初始值*/ uint32 Crc_Xorout;      /*CRC校验结果异或值*/ 
} CRC_TYPE;/********************     全局函数声明     ********************/
uint32 calc_crc(E_CRC_TYPE crc_type, uint8 *pData, uint16 u16Len);
/**************************************************************/#endif
/***************************************************************************************************
源文件名: crc.c
文件描述: CRC校验
作者信息: Bachelor Tse
创建日期: 2024-04-01
最新版本: 0.0.1
修改记录: 
*****************************************************************************/
#include "crc.h"CRC_TYPE crc_map[] = {/*CRC校验方式     宽度位数    输入反转    输出反转    多项式       初始值    结果异或值*/{CRC4_ITU,          4,        TRUE,       TRUE,     0x03,       0x00,       0x00},{CRC5_EPC,          5,        FALSE,      FALSE,    0x09,       0x09,       0x00},{CRC5_ITU,          5,        TRUE,       TRUE,     0x15,       0x00,       0x00},{CRC5_USB,          5,        TRUE,       TRUE,     0x05,       0x1F,       0x1F},{CRC6_ITU,          6,        TRUE,       TRUE,     0x03,       0x00,       0x00},{CRC7_MMC,          7,        FALSE,      FALSE,    0x09,       0x00,       0x00},{CRC8,              8,        FALSE,      FALSE,    0x07,       0x00,       0x00},{CRC8_ITU,          8,        FALSE,      FALSE,    0x07,       0x00,       0x55},{CRC8_ROHC,         8,        TRUE,       TRUE,     0x07,       0xFF,       0x00},{CRC8_MAXIM,        8,        TRUE,       TRUE,     0x31,       0x00,       0x00},{CRC16_IBM,         16,       TRUE,       TRUE,     0x8005,     0x0000,     0x0000},{CRC16_MAXIM,       16,       TRUE,       TRUE,     0x8005,     0x0000,     0xFFFF},{CRC16_USB,         16,       TRUE,       TRUE,     0x8005,     0xFFFF,     0xFFFF},{CRC16_MODBUS,      16,       TRUE,       TRUE,     0x8005,     0xFFFF,     0x0000},{CRC16_CCITT,       16,       TRUE,       TRUE,     0x1021,     0x0000,     0x0000},{CRC16_CCITT_FALSE, 16,       FALSE,      FALSE,    0x1021,     0xFFFF,     0x0000}, {CRC16_X25,         16,       TRUE,       TRUE,     0x1021,     0xFFFF,     0xFFFF},{CRC16_XMODEM,      16,       FALSE,      FALSE,    0x1021,     0x0000,     0x0000},{CRC16_DNP,         16,       TRUE,       TRUE,     0x3D65,     0x0000,     0xFFFF},{CRC32,             32,       TRUE,       TRUE,     0x04C11DB7, 0xFFFFFFFF, 0xFFFFFFFF},{CRC32_MPEG2,       32,       FALSE,      FALSE,    0x04C11DB7, 0xFFFFFFFF, 0x00000000},
};/********************     静态函数声明     ********************/
static void Data_Bit_Invert(uint8_t *OutBuf, uint8_t *InBuf, uint8 Bit_Len);
/**************************************************************//********************     静态函数Start     ********************//*=============================================================================================** Function	: static void Data_Bit_Invert(uint8_t *OutBuf, uint8_t *InBuf, uint8 Bit_Len)** Description : v0.1 2024-04-01 xpx** Remark      : 数据按位反转(支持小于等于32位数据反转)
=============================================================================================*/
static void Data_Bit_Invert(uint8_t *OutBuf, uint8_t *InBuf, uint8 Bit_Len)
{uint8 i;uint32 Intmp = 0;uint32 Outtmp = 0;if((void*)0 == OutBuf || (void*)0 == InBuf || 32 < Bit_Len){return;}for(i = 0; i < Bit_Len / 8; i++){Intmp |= (InBuf[i] << (i * 8));}if(0 != Bit_Len%8){Intmp |= ((InBuf[i] << (i * 8)) & ((0xFF >> (8 - (Bit_Len % 8))) << (i * 8)));}for(i = 0; i < Bit_Len; i++){if(Intmp & (1 << i)){Outtmp |= (1 << (Bit_Len - 1 - i));}}for(i = 0; i < Bit_Len / 8; i++){OutBuf[i] = ((Outtmp >> (i * 8)) & 0xFF);}if(0 != Bit_Len % 8){OutBuf[i] &= (~(0xFF >> (8 - (Bit_Len % 8))));OutBuf[i] |= ((Outtmp >> (i * 8)) & (0xFF >> (8 - (Bit_Len % 8))));}
}/********************     静态函数End     ********************//********************     全局函数Start     ********************//*=============================================================================================** Function	: uint32 calc_crc(E_CRC_TYPE crc_type, uint8 *pData, uint16 u16Len)** Description : v0.1 2024-04-01 xpx** Remark      : CRC校验函数接口(数据输入最小单位为字节)
=============================================================================================*/
uint32 calc_crc(E_CRC_TYPE crc_type, uint8 *pData, uint16 u16Len)
{uint8 tmpdata = 0;uint8 Crc_Width = crc_map[crc_type].Crc_Width;        /*CRC校验宽度位数*/    uint8 Crc_InputInvert = crc_map[crc_type].Crc_InputInvert;  /*CRC校验输入反转*/ uint8 Crc_OutputInvert = crc_map[crc_type].Crc_OutputInvert; /*CRC校验输出反转*/ uint32 Crc_Poly = crc_map[crc_type].Crc_Poly;        /*CRC校验多项式*/ uint32 Crc_Init_Value = crc_map[crc_type].Crc_Init_Value;  /*CRC校验初始值*/ uint32 Crc_Xorout = crc_map[crc_type].Crc_Xorout;      /*CRC校验结果异或值*/     uint32 u32CrcVal = 0;if ((void*)0 == pData || 0 == u16Len || CRC_TYPE_NUM <= crc_type) {return u32CrcVal;}u32CrcVal = Crc_Init_Value;     /* CRC寄存器装载初始值INIT */while(u16Len--){if(TRUE == Crc_InputInvert)     /* 输入数据反转(REFIN)*/{Data_Bit_Invert(&tmpdata, pData, 8);}else{tmpdata = *pData;}if(Crc_Width >= 8)   /* 需将字节数据最高位与CRC校验值最高位对齐再异或 */{u32CrcVal ^= (tmpdata << (Crc_Width - 8));}else {u32CrcVal <<= (8 - Crc_Width);  /* CRC校验宽度位数小于8时 将CRC校验值最高位与字节数据最高位(第7位)对齐 */u32CrcVal ^= tmpdata;}for (uint8 i = 0; i < 8; i++){if(Crc_Width >= 8)   {if (u32CrcVal & (0x00000001 << (Crc_Width - 1))){      u32CrcVal <<= 1;        u32CrcVal ^= Crc_Poly;}else{u32CrcVal <<= 1;}}else    /* 上方因便于数据计算而对齐至第7位,故CRC校验值异或多项式时也需将其移位 */{if (u32CrcVal & (0x00000001 << 7)){     u32CrcVal <<= 1;u32CrcVal ^= (Crc_Poly << (8 - Crc_Width));}else{u32CrcVal <<= 1;}}            }if(Crc_Width >= 8){}else    /* CRC校验宽度位数小于8时,为了便于数据计算而对齐,故输出时需将其恢复原位 */{u32CrcVal >>= (8 - Crc_Width);}            u32CrcVal &= (0xFFFFFFFF >> (8 * sizeof(uint32) - Crc_Width));    /*截取CRC数据*/pData++;}if(TRUE == Crc_OutputInvert)        /* 输出数据反转(REFOUT)*/{Data_Bit_Invert((uint8*)&u32CrcVal, (uint8*)&u32CrcVal, Crc_Width);}    u32CrcVal ^= Crc_Xorout;            /* 输出结果异或XOROUT值*/return u32CrcVal;	
}/********************     全局函数End     ********************/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/814142.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【蓝桥杯】第十五届蓝桥杯大赛软件赛省赛(Java研究生组)个人解题思路及代码分享

文章目录 试题A&#xff1a;劲舞团试题B&#xff1a;召唤数字精灵试题C&#xff1a;封闭图形的个数试题D&#xff1a;商品库存管理试题E&#xff1a;砍柴试题F&#xff1a;回文字符串试题G&#xff1a;最大异或节点试题H&#xff1a;植物生命力 试题A&#xff1a;劲舞团 【问题…

napi系列学习高阶篇——通过IDE集成C/C++三方库并开发napi接口

简介 应用在调用系统固件集成的C/C三方库时&#xff0c;可能会由于系统固件集成端与IDE的NDK中libc版本不一致导致调用失败&#xff0c;而且系统固件集成的C/C三方库对于应用的调式也很不友好&#xff0c;需要多方编译调试&#xff0c;很不方便。因此本文将通过在IDE上适配ope…

mp3怎样才能转换成wav格式?音频互相转换的方法

一&#xff0c;什么是WAV WAV&#xff0c;全称为波形音频文件&#xff08;Waveform Audio File Format&#xff09;&#xff0c;是一种由微软公司和IBM公司联合开发的音频文件格式。自1991年问世以来&#xff0c;WAV格式因其无损的音频质量和广泛的兼容性&#xff0c;成为了多…

【opencv】示例-morphology2.cpp 形态学操作:膨胀、腐蚀、开运算、闭运算

element_shape MORPH_ELLIPSE; element_shape MORPH_RECT element_shape MORPH_CROSS; // 包含必要的OpenCV头文件 #include "opencv2/imgproc.hpp" // 图像处理 #include "opencv2/imgcodecs.hpp" // 图像编码解码 #include "opencv2/highgui.hpp…

Zynq学习笔记--AXI 总线概述

目录 1. AXI总线概述 1.1 主要特点 1.2 通道功能 1.3 信号概览 2. AXI Interconnect 2.1 信号说明 2.2 内部结构 3. PS-PL AXI Interface 3.1 AXI FPD/LFP/ACP 3.2 Address Editor 3.3 地址空间 3.4 AXI-DDR 4. 通过ILA观察AXI信号 4.1 AXI 读通道 1. AXI总线概述…

Linux高级IO——多路转接之poll

本章代码Gitee地址&#xff1a;PollServer 文章目录 1. poll2. poll_server 1. poll poll的作用和select一模一样&#xff0c;只负责等待 poll在select的基础之上解决了select的两个硬伤&#xff1a; select等待的fd有上限select输入输出参数较多 #include <poll.h> …

【软件设计师知识点】八、数据库技术基础

文章目录 数据库基本术语关系型数据库基本术语数据库模型三级模式二级映射数据的独立性数据模型常用数据模型E-R 图(概念设计)数据库操作完整性规则关系代数运算集合运算符关系运算符数据库语言 SQL数据定义语言(DDL)

uniapp开发小程序手写板、签名、签字

可以使用这个插件进行操作 手写板-签名签字-lime-signature - DCloud 插件市场 但是目前这个插件没有vue3 setup Composition API的写法。所以对于此文档提供的可以直接使用,需要使用Composition API方式实现的,可以继续看。 因为Composition API方式,更加的简单、灵活,…

Java编程题目 | 四个数的三三组合

大家可以关注一下专栏&#xff0c;方便大家需要的时候直接查找&#xff0c;专栏将持续更新~ 题目描述 使用数字1、2、3、4&#xff0c;编写一个Java程序&#xff0c;找出所有互不相同且每个三位数中不含有重复数字的组合&#xff0c;并输出这些组合。 解题思路 使…

记录一个腾讯云上kafka不能正常启动问题

问题描述&#xff1a;刚在新的腾讯云三台节点上安了Zookeeper和kafka&#xff0c;改好对应配置文件后&#xff0c;启动zk和kafka。 启动zk后&#xff0c;启动kafka jpsall以后 发现两个进程都启了&#xff08;这里有猫腻&#xff0c;kafka其实没起来&#xff0c;过几秒就自动掉…

在Windows中用命令行编译C项目

在Windows中可以用命令行编译C项目 官方指导文档&#xff1a; 演练&#xff1a;在命令行上编译 C 程序 | Microsoft Learn 在官方文档中可以看到&#xff0c;可以只安装VS的命令行工具集&#xff0c;如下图所示

2.0 Hadoop 运行环境

2.0 Hadoop 运行环境 分类 Hadoop 教程 由于 Hadoop 是为集群设计的软件&#xff0c;所以我们在学习它的使用时难免会遇到在多台计算机上配置 Hadoop 的情况&#xff0c;这对于学习者来说会制造诸多障碍&#xff0c;主要有两个&#xff1a; 昂贵的计算机集群。多计算机构成的…

JVM性能调优——GC日志分析

文章目录 1、概述2、生成GC日志3、Parallel垃圾收集器日志解析3.1、Minor GC3.2、FULL GC 4、G1垃圾收集器日志解析4.1、Minor GC4.2、并发收集4.3、混合收集4.4、Full GC 5、CMS垃圾收集器日志解析5.1、Minor GC5.2、Major GC5.3、浮动垃圾 6、日志解析工具6.1、GCeasy6.2、GC…

SpringBoot项目 jar包方式打包部署

SpringBoot项目 jar包方式打包部署 传统的Web应用进行打包部署&#xff0c;通常会打成war包形式&#xff0c;然后将War包部署到Tomcat等服务器中。 在Spring Boot项目在开发完成后&#xff0c;确实既支持打包成JAR文件也支持打包成WAR文件。然而&#xff0c;官方通常推荐将Sp…

【Godot4.2】CanvasItem绘图函数全解析 - 8.绘制点索引

概述 在示意图绘制过程中或者测试过程中&#xff0c;可能需要标记点的索引。 最常见的形式就是用一个圆圈作为背景&#xff0c;用阿拉伯数字作为索引。 实现的重点是动态计算背景圆的半径。原理是&#xff0c;获取字符串的矩形&#xff0c;取对角线长度的一半作为外接圆的半…

AI PC元年,华为的一张航海图、一艘渡轮和一张船票

今天&#xff0c;从学术研究者到产业投资者&#xff0c;无不认为大模型掀起了一场人工智能的完美风暴。 所谓“完美风暴”&#xff0c;指的是一项新技术的各个要素&#xff0c;以新的方式互相影响、彼此加强&#xff0c;组合在一起形成了摧枯拉朽般的力量。 而我们每个人&#…

【运维笔记】深入理解反向代理的原理及应用

一、引言 在现代网络架构中&#xff0c;反向代理是一个核心组件&#xff0c;它在提升网站性能、增加安全性和简化网络流量管理方面发挥着至关重要的作用。本文将深入探讨反向代理的原理&#xff0c;展示其在不同场景下的应用&#xff0c;并通过具体案例来说明如何实现和优化反…

【opencv】示例-phase_corr.cpp 捕获视频流并通过计算相位相关性来检测画面中的移动...

// 包含OpenCV库的头文件 #include "opencv2/core.hpp" // 包含OpenCV核心功能 #include "opencv2/videoio.hpp" // 包含视频IO功能 #include "opencv2/highgui.hpp" // 包含高级GUI功能&#xff0c;显示图像 #include "opencv2/imgproc.hp…

机器视觉系列之【硬件知识】-工业相机(三)

目录 几个高频面试题目 如何解决工业相机的丢帧现象 工业相机是怎么实现触发的?

SpringCloud 2021.0.9 OpenFeign 与 circuitbreaker-resilience4j 使用示例

背景 OpenFeign是微服务中服务远程调用组件。 circuitbreaker 是断路器的抽象接口。 resilience4j是断路器的一种实现。 在服务间远程调用过程中&#xff0c;为了避免服务雪崩&#xff0c;需要设置失败保护机制&#xff0c;当下游服务超时或者不可用时&#xff0c;上游服务可…