基于Qt5.15的CRC校验小工具开发项目

  • 前言
  • 一、开发准备
  • 二、开发流程
    • 1.Qt配置与界面设置
    • 2.控件基本配置
    • 3.CRC算法介绍
    • 4.信号与槽的四个响应事件
    • 5.打包发布
  • 总结

前言

近期用到CRC校验算法,网上搜索很多示例都有问题,所以研究了一下基于Qt写了个CRC校验小工具。


一、开发准备

  • 开发环境:Windows10(开始基于Mac开发,感觉Mac系统下Qt的适配性不如Windows好,最终选择万能的Windows)
  • Qt基础:掌握信号与槽,UI界面,Qt资源文件等
  • C++基础:构造与析构函数,类的继承,数组与指针,正则表达式,初始化列表等
  • CRC算法(基于多项式的CRC8、CRC16和CRC32)

二、开发流程

1.Qt配置与界面设置

  • 新建项目->选择Qt Widgets Application->选择QWidget基类->勾选Generate form(注意:勾选后才能生成.ui后缀文件,才能手动拖控件)

  • 项目树如下图所示,只需要修改画圈的文件,项目树介绍:

    1.crcTools.pro:项目配置文件,这个一般会自动配置,不需要管,引入Qt所用到的核心库以及项目文件。
    2.main.cpp:主进程循环文件,一般不需要变动。
    3.mywidget.h和mywidget.cpp:需要你去编程的两个主要继承类文件,用于写你的方法和算法。
    4.mywidget.ui:用于推拽控件的UI界面。
    5.images.qrc:Qt的资源文件,用于存储图片等资源信息。

  • 双击生成的myWidget.ui文件,便可进入控件拖拽UI界面,最终如下图所示UI分为数据输入区,算法设置区和结果校验区。

2.控件基本配置

  • 自定义myWidget类继承自基类QWidget,其中QWidget类又继承于QObject类。
  • this指针指向ui界面,通过this指针获取ui界面的控件
  • 界面标题设置通过setWindowTitle函数,其中要注意加入QString::fromLocal8Bit用于本地字符GB到Unicode转换,解决中文乱码问题;其他控件初始化设置如下面程序可得。
  • 信号与槽通过connect函数连接,比如计算按钮的点击事件函数会响应CRC校验算法函数进行计算,可以将一个connect函数看作一个事件响应过程,包括四个事件(算法选择事件,复制校验码事件,CRC算法计算事件和界面清空事件)。
myWidget::myWidget(QWidget *parent): QWidget(parent), ui(new Ui::myWidget)
{ui->setupUi(this);//UI参数设置this->setWindowTitle(QString::fromLocal8Bit("CRC小工具"));this->setWindowIcon(QIcon(":/images/C:/Users/Administrator/Pictures/icon/yang16.png"));this->setFixedSize(581,281);//算法UI列表初始化,共16个算法QStringList CRCList;CRCList.clear();CRCList <<QStringLiteral("CRC8")<<QStringLiteral("CRC8/ITU")<<QStringLiteral("CRC8/ROHC")<<QStringLiteral("CRC8/MAXIM")<<QStringLiteral("CRC16/IBM")<<QStringLiteral("CRC16/MAXIM")<<QStringLiteral("CRC16/USB")<<QStringLiteral("CRC16/MODBUS")<<QStringLiteral("CRC16/CCITT")<<QStringLiteral("CRC16/CCITT-FALSE")<<QStringLiteral("CRC16/X25")<<QStringLiteral("CRC16/XMODEM")<<QStringLiteral("CRC16/DNP")<<QStringLiteral("CRC32")<<QStringLiteral("CRC32/MPEG-2");ui->comboBox->clear();ui->comboBox->addItems(CRCList);crcSelectInit();//算法选择初始化connect(ui->comboBox,SIGNAL(currentIndexChanged(QString)),this,SLOT(crcSelectInit()));//点击清空事件connect(ui->pushButton_3,SIGNAL(clicked()),this,SLOT(allClearEvent()));//复制校验码connect(ui->pushButton,SIGNAL(clicked()),this,SLOT(copyCheckCode()));//计算CRC事件connect(ui->pushButton_2,SIGNAL(clicked()),this,SLOT(crcCalculate()));
}

3.CRC算法介绍

  • CRC校验(循环冗余校验)是数据通讯中最常采用的校验方式,就是将需要校验的数据与多项式进行循环异或(XOR),将得到的校验码附在数据末尾发送出去。
  • 常见CRC多项式参数模型参考CRC在线校验工具CRC在线校验工具。
  • CRC算法参数模型解释:
    1.POLY:多项式的简写,以16进制表示。例如:CRC-32即是0x04C11DB7,忽略了最高位的"1",即完整的生成项是0x104C11DB7。
    2.INIT:这是算法开始时寄存器(crc)的初始化预置值,十六进制表示。
    3.REFIN:输入数据每个字节是否反转。
    4.REFOUT:计算输出之后,异或输出之前,得到的数据进行反转。
    5.XOROUT:计算结果与该参数异或得到最终的CRC校验码。

4.信号与槽的四个响应事件

  • 算法初始化响应事件,界面开始运行时的参数指向设置。
//算法选择初始化函数
//算法参数peizhi
QString myWidget::crcName[15] = {"CRC8","CRC8/ITU","CRC8/ROHC","CRC8/MAXIM","CRC16/IBM","CRC16/MAXIM","CRC16/USB","CRC16/MODBUS","CRC16/CCITT","CRC16/CCITT-FALSE","CRC16/X25","CRC16/XMODEM","CRC16/DNP","CRC32","CRC32/MPEG-2"};
QString myWidget::crcPoly[15] = {"07","07","07","31","8005","8005","8005","8005","1021","1021","1021","1021","3D65","04C11DB7","04C11DB7"};
QString myWidget::crcInit[15] = {"00","00","FF","00","0000","0000","FFFF","FFFF","0000","FFFF","FFFF","0000","0000","FFFFFFFF","FFFFFFFF"};
QString myWidget::crcXout[15] = {"00","55","00","00","0000","FFFF","FFFF","0000","0000","0000","FFFF","0000","FFFF","FFFFFFFF","00000000"};
bool myWidget::inputReverse[15] = {false,false,true,true,true,true,true,true,true,false,true,false,true,true,false};
bool myWidget::outputReverse[15] = {false,false,true,true,true,true,true,true,true,false,true,false,true,true,false};void myWidget::crcSelectInit()
{int tempCRC = ui->comboBox->currentIndex();//qDebug()<<"算法检索位:"<<tempCRC;ui->lineEdit_2->setText(QString(myWidget::crcPoly[tempCRC]));ui->lineEdit_3->setText(QString(myWidget::crcInit[tempCRC]));ui->lineEdit_4->setText(QString(myWidget::crcXout[tempCRC]));ui->checkBox->setChecked(myWidget::inputReverse[tempCRC]);ui->checkBox_2->setChecked(myWidget::outputReverse[tempCRC]);ui->lineEdit_2->setEnabled(false);ui->lineEdit_3->setEnabled(false);ui->lineEdit_4->setEnabled(false);ui->checkBox->setEnabled(false);ui->checkBox_2->setEnabled(false);
}
  • 点击清空响应事件。
void myWidget::allClearEvent()
{ui->plainTextEdit->clear();ui->lineEdit->clear();ui->comboBox->setCurrentIndex(0);
}
  • 复制事件,将得出的校验码复制到剪切板。
void myWidget::copyCheckCode()
{//获取系统剪切板指针QClipboard *clipBoard = QApplication::clipboard();QString checkCode = ui->lineEdit->text();clipBoard->setText(checkCode);
}
  • CRC校验事件。
void myWidget::crcCalculate()
{//判断输入数据和配置参数是否为空QString dataInput = ui->plainTextEdit->toPlainText();QString line2 = ui->lineEdit_2->text();QString line3 = ui->lineEdit_3->text();QString line4 = ui->lineEdit_4->text();//判断输入数据格式bool isFormat = dataInput.contains(QRegExp("[^0-9a-fA-F\\s]+"));if(isFormat || dataInput.isEmpty()){QMessageBox::information(this,QString::fromLocal8Bit("提示"),QString::fromLocal8Bit("输入数据格式不正确!"));allClearEvent();return;}else{//重置输入数据格式//qDebug()<<"原始输入数据:"<<dataInput;QStringList tempDataList = dataInput.split(" ");QString tempData;//去掉空格后拼接完整的字符串QString crcData16;for(int i=0;i<tempDataList.count();i++){tempData += tempDataList[i];}crcData16 = tempData;//将字符串进行重新安排显示int crcDataLength = tempData.length();int m8 = 0;int n8 = 0;while(m8<crcDataLength-1){m8 += 2;tempData.insert(m8+n8," ");n8 += 1;}tempData = tempData.simplified();ui->plainTextEdit->clear();ui->plainTextEdit->setPlainText(tempData);//将字符串进行重新安排显示//最大校验字节限制在1028个//CRC8校验QStringList dataList8 = tempData.split(" ");unsigned char buf8[1028] = {0};QString temp1;for(int i=0;i<dataList8.length();i++){temp1 = dataList8.at(i);buf8[i] = temp1.toInt(0,16);}int tempCRC = ui->comboBox->currentIndex();if(tempCRC<4){CRC8(buf8,dataList8.length(),tempCRC);}if(tempCRC>12){CRC32(buf8,dataList8.length(),tempCRC);}if(tempCRC>3 & tempCRC<13){CRC16(buf8,dataList8.length(),tempCRC);}}
}

5.打包发布

  • 将编译生成的exe文件拷贝到一个空文件夹,这时候打不开提示缺少qt核心库,这是因为qt动态链接库没被编译连接到,打开Qt的管理员终端,如下图所示。
  • cd到你刚才拷贝exe的文件夹位置,输入:windeployqt crcTools.exe,会自动将需要链接的文件拷贝到文件夹,之后便可以运行exe文件。


总结

该工具可以计算CRC8,CRC16以及CRC32位的数据校验码,欢迎大家评论、下载与转发,最后附上我的Github地址,欢迎大家骚扰哈!

基于Qt5.15的CRC校验小工具开发项目相关推荐

  1. 基于PySimpleGUI和VXI11的示波器小助手开发项目

    1.项目描述 (1)开发一个工具,可以使计算机通过网线操控示波器,完成指令下发.保存截图.运行脚本等功能: (2)环境配置:windows10 PC.Tek示波器(兼容3k.5k系列): (3)使用v ...

  2. 限时购校验小工具dubbo异步调用实现限

    本文来自网易云社区 作者:张伟 背景 限时购是网易考拉目前比较常用的促销形式,但是前期创建一个限时购活动时需要各个BU按照指定的Excel格式进行选品提报,为了保证提报数据准确,运营需要人肉校验很多信 ...

  3. python制作翻译小软件_如何基于Python制作有道翻译小工具

    这篇文章主要介绍了如何基于Python制作有道翻译小工具,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 该工具主要是利用了爬虫,爬取web有道翻译的 ...

  4. can协议crc计算_基于CAN总线的CRC校验码的原理与实现

    基于CAN总线的CRC校验码的原理与实现 王鹏 [摘 要]CAN总线又称为控制器局域网技术,属于工业现场总线,应用范围很广.CAN系统中通常 采用反馈重发机制对通信过程进行差错控制.当接收端反馈给发送 ...

  5. WPF 开源二维绘画小工具 GeometryToolDemo 项目

    这是一个演示 WPF 进行二维绘画的小工具 Demo 项目,基于 MIT 协议在 GitHub 上完全开源 源作者是 YuWeiCong 我只是帮助开源的工具人 软件运行界面效果: 开源地址: htt ...

  6. 小工具开发笔记—IE自动填表器—第一篇:你好,世界

    系列导航: 小工具开发笔记-IE自动填表器-第零篇:序 小工具开发笔记-IE自动填表器-第一篇:你好,世界 继上篇博文初步介绍了小工具,本文就作为开发笔记正文第一篇,来叙述一下如何使用C++开发一个完 ...

  7. qt5.15.2-银河麒麟-龙芯国产化-项目打包踩坑实录

    qt5.15.2-银河麒麟-龙芯国产化-项目打包踩坑实录 linuxdeployqt几乎是唯一解决方案,网上各种自己写脚本根据ldd去拷贝的,最后大概率都是segment default-除非你是纯Q ...

  8. 基于pygame的消消乐小游戏开发

    1 简介 今天向大家介绍一个帮助往届学生完成的毕业设计项目,基于pygame的消消乐小游戏开发. 计算机毕业生设计,课程设计需要帮助的可以找我 2 设计概要 21世纪是信息化时代,随着信息技术和网络技 ...

  9. jQuery开发之windows边栏小工具开发(Gadget development)- wi...

    为什么80%的码农都做不了架构师?>>>    jQuery开发之windows边栏小工具开发(Gadget development)- windows小工具实现的电话薄查询工具 作 ...

最新文章

  1. struts2实验2:struts2.xml action中* ,{}以及${}
  2. 洛谷 P3157 [CQOI2011]动态逆序对 | CDQ分治
  3. 2016第51周三产品经理如何更有说服力
  4. C语言常用的字符串函数
  5. UTF-8和BOM的一些说明
  6. jersey球衣是什么_球衣知识------关于NIKE球衣(Jersey)的介绍
  7. 【PAT】B1070 结绳(25 分)
  8. 高通和英特尔向美国政府施压,要求减轻华为禁令;ATT又裁员1800人,一年解雇2.3万人;Facebook加密货币推出在即……...
  9. ios开发之验证你的服务器ATS是否PASS
  10. php网站程序更新功能,运用PHP定时自动更新网站首页HTML的方法
  11. JavaScript笔记1基础
  12. win安装soapui
  13. 批量调取接口_调用API接口批量查手机归属地
  14. 中软酒店管理系统CSHIS操作手册_数据结构_数据字典
  15. 脚本小子_Lua安装教程
  16. 《Computer Graphics C Version》(Donald Hearn著)总结 第五章(第一部分)
  17. 光模块(光口)和电模块(电口)
  18. jeefast使用Mybatis进行图片上传
  19. 陈绮贞 旅行的意义 Ukulele 尤克里里谱
  20. 对话“1024程序员节”嘉宾 ——RT-Thread 创始人熊谱翔

热门文章

  1. 某猪微店状元分销V2.0钻石纯净安装版+全开源
  2. 属于计算机更新的产品有什么,微软更新电脑产品线了,但可能不是给你用的
  3. 解决部分浏览器不能显示itext生成的PDF文件文本域内容问题
  4. celery后台运行
  5. 敏捷开发般若敏捷系列之十三:传播敏捷十戒(一)
  6. ubuntu 硬盘安装图解
  7. 基于PLC数控钻床控制系统设计(说明书+开题报告+CAD 接线图 梯形图 原理图)
  8. Oracle12C删除用户
  9. Android一种字幕效果的实现
  10. uki_Uki下载_Uki安卓版下载_Uki最新版下载v5.0.6-我的世界中文网