先放原文链接:CRC32校验算法C语言版(查表法)

这几天搞串口通信,用到CRC32,把以前用到的东西整理一下,方便以后使用。
STM32F103 芯片自带的CRC32硬件算法,匹配上位机CRC32算法。

CRC校验变化太多,有CRC4/5/6/7/8/16/32,每一种的多项式也有很多种变化,输入输出方式也有区别,有一些初始值是0,有一些初始值是0xFFFFFFFF,有一些直接返回,有一些异或返回,因此,CRC校验很难用一个代码兼容全部,只能根据具体项目修改相关参数。

本次使用查表法处理:

计算方法:

  1. 先要知道多项式是什么样子,以这个IEEE802.3标准CRC32多项式为例:x32 + x26 + x23 + x22 + x16 + x12 + x11 + x10 + x8 + x7 + x5 + x4 + x2 + x+ 1,根据位取值不同,会有各种多项式。

  2. STM32F103 使用CRC-32(以太网)多项式:0x4C11DB7
    x32 则对应32bit = 1, x26 则对应26bit=1,得出一个值:(1<<32)|(1<<26)|(1<<23)|(1<<22)|…|(1<<1)|(1)=0x104C11DB7,最高位固定为1,均忽略,对于CRC32取低32位,则多项式的值为 0x4C11DB7

  3. 用这个值生成长度为256的码表,对于CRC32表内每个元素都为32bit.

  4. 使用时查表得出CRC32值。

具体算法代码如下

/*
* CRC校验算法,查表法
*/
#include "crc.h"static unsigned long table[256];//位翻转
static unsigned long bitrev(unsigned long input, int bw)
{int i;unsigned long var;var = 0;for(i=0;i<bw;i++){if(input & 0x01){var |= 1<<(bw-1-i);}input>>=1;}return var;
}//码表生成
//如:X32+X26+...X1+1,poly=(1<<26)|...|(1<<1)|(1<<0)
void crc32_init(unsigned long poly)
{int i;int j;unsigned long c;poly=bitrev(poly,32);for(i=0; i<256; i++){c = i;for (j=0; j<8; j++){if(c&1){c=poly^(c>>1);}else{c=c>>1;}}table[i] = c;}
}unsigned long crc32(unsigned long crc, void* input, int len)
{int i;unsigned char index;unsigned char* pch;pch = (unsigned char*)input;for(i=0;i<len;i++){index = (unsigned char)(crc^*pch);crc = (crc>>8)^table[index];pch++;}return crc;
}测试用例:void main(void)
{unsigned long crc;crc32_init(0x4C11DB7,table);crc = 0xFFFFFFFF;crc=crc32(crc,"1234567890",10);crc ^= 0xFFFFFFFF;printf("CRC32=%08X\n",crc);system("pause");
}

计算结果:CRC32=0x261DAEE5

注意:实际使用中可能会调整 CRC 的初值为 0 或 位翻转。

【转载】CRC32校验算法C语言版(查表法)相关推荐

  1. c语言利用查表法画正弦波,嵌入式C语言查表法在项目中的应用

    就像下面的这个表 之前写过上面这个标题的一篇文章,讲的是以位移的方式去遍历表中的数据,效率非常高,但是,如果要实现一个乱序的流水灯或者跑马灯的话,思考一个这样的算法是不可取的,很费时间,也很费脑力,于 ...

  2. QT ModbusCRC16 校验码计算(非查表法,直接计算)

    记录一下QT中如何实现 ModbusCRC16 校验码计算 #include <QCoreApplication> #include <QDebug>//CRC16计算函数 u ...

  3. CRC校验查表法详解

    CRC校验查表法详解 算法原理 基础计算 查表法原理及计算 查表法中的表 CRC校验中数据逆序 CRC校验中的其它参数 算法原理 CRC(Cyclic Redundance Check)循环冗余校验, ...

  4. C语言 crc32校验算法原理,CRC循环冗余校验的实现原理

    之前在做学校项目的时候用到了CRC 原理,但在网上查找的过程中,发现讲解CRC知识的资源很多,但是对新手比较友好的.讲的十分清楚的又很少,很多资料也不完善,读起来心中常常不由自主地奔腾过上千个&quo ...

  5. 异或校验算法 c语言程序,C# 异或校验算法

    C# 的异或校验算法 直接上代码 public partial class FormCRC : Form { public FormCRC() { InitializeComponent(); } p ...

  6. 《数据结构与算法 C语言版》—— 3.8习题

    本节书摘来自华章出版社<数据结构与算法 C语言版>一 书中的第3章,第3.8节,作者:徐凤生,更多章节内容可以访问云栖社区"华章计算机"公众号查看. 3.8习题 1名 ...

  7. 《数据结构与算法 C语言版》—— 2.5上机实验

    本节书摘来自华章出版社<数据结构与算法 C语言版>一 书中的第2章,第2.5节,作者:徐凤生,更多章节内容可以访问云栖社区"华章计算机"公众号查看. 2.5上机实验 实 ...

  8. 《数据结构与算法 C语言版》—— 2.7习题

    本节书摘来自华章出版社<数据结构与算法 C语言版>一 书中的第2章,第2.7节,作者:徐凤生,更多章节内容可以访问云栖社区"华章计算机"公众号查看. 2.7习题 1描 ...

  9. c语言实现感知器算法,感知器算法(c语言版).doc

    感知器算法(c语言版).doc includestdio.hincludetime.hdefine C 1void mainint i,j,k,N1,N2,x202,s3,d20,array204,w ...

最新文章

  1. 怎样知道邮箱的端口_网络端口介绍
  2. for循环嵌套 简单优化
  3. Jquery提交表单 Form.js官方插件介绍
  4. phpStorm注册码
  5. 『.NET Core CLI工具文档』(二).NET Core 工具遥测(应用信息收集)
  6. 利用matlab guide制作简易计算器
  7. 20万+奖金池,“智在飞翔”2021 • 无人飞行器智能感知大赛,战火重燃 • 等你来战!!...
  8. 超硬核的 OCR 开发利器推荐:从场景案例到实操演示,快速掌握OCR模型训练
  9. Java中文件复制的一个汇总
  10. [leetcode]Word Ladder
  11. iphone4 Safari实现滚动条功能
  12. 12_电话拨号器_界面实现
  13. 向小伙伴讲讲搜索引擎?读完这个文章先
  14. python+requests+pytest_Python+Requests+Pytest 在window下的安装(附pip升级过程遇到的问题)...
  15. tensorflow keras 构建神经网络、Alex net、VGG、CNN网络
  16. FLUENT中的常用边界条件
  17. java游戏暗金装备_暗黑2装备升级公式图解(暗金装备升级一览表)
  18. DeFi之三:未来什么样——资产通证化
  19. WPF技巧(5)元素的加载与卸载(Loaded and Unloaded)
  20. 绝情且残酷!1780元暴力解聘患癌10年老员工,完美世界心真“硬”

热门文章

  1. Microsoft Dynamics CRM 2011 SDK 5.07版本已经发布
  2. android便签工具下载,小鱼便签软件下载-小鱼便签 安卓版v1.01.14-PC6安卓网
  3. Zookeeper Java 客户端 ——Apache Curator
  4. pythondjango的用途_django框架的作用是什么
  5. python画circos图_circos作图四(links)
  6. pso算法matlab程序,基本PSO算法的matlab源程序
  7. 使用CNN进行ROI提取(优化代码篇)
  8. GeoTools,JTS和GeoAPI -- (学习GIS【3】)
  9. CSS简单的交互动效
  10. 韩星来华圈钱猛上综艺节目,为啥不拍戏