目录

  • 概述
  • 实现步骤
    • 1.调整界面并布局。
    • 2.显示文件路径和偏移量
    • 3.bin文件读取
    • 4.将读取的bin文件写入到新的文件。
    • 5.测试运行效果:
    • 6.解决00结束符问题
  • GitHub下载

概述

上一小节主要是练习下本地文件的打开和另存为,现在我们开始正式bin文件合成工具的开发。

先学习《Qt学习之路2.pdf》第36节 二进制文件读写。

本篇文章的目标:
1.重新设计界面
2.实现不同bin文件的选取
3.合成bin文件涉及的内容略多:将选好的3个bin文件根据偏移量合成为1个bin文件,空出的内容填充为FF。在本篇文章,我们先实现一个bin文件的读取和另存写入。

实现步骤

1.调整界面并布局。

工具是为了自己开发方便,不求做成一个通用工具去发布给大家使用(这个可能比较耗精力,作为初学者我还是先简单实现即可)。我的实际应用中合成主要分为3端,IAP、APP、最后的参数页。界面设计如下,其中路径和偏移量的显示框我们都是用LineEdit组件,避免出现换行问题:

2.显示文件路径和偏移量

IAP、APP、Para三个按钮实现功能相同,选取本地bin文件,将路径和默认偏移量填写到界面的对应位置即可。在上一小节已经测试过通过文件框选取本地文件。

    QString path = QFileDialog::getOpenFileName(this,tr("Open File"),//控件的objectName".",           //对话框显示时默认打开的目录,"." 代表程序运行目录tr("Bin Files(*.bin)"));   //对话框的后缀名过滤器,将txt文件改为bin文件。qDebug("path = %s",qPrintable(path));

这里我们只需将过滤器修改为*.bin即可。将path打印出来,即为选中文件的绝对路径:

将path直接填充到路径显示框中即可。程序中没有使用path,而是使用一个QString变量获取文件信息,最后进行填充:

 QString buf;QFileInfo info(file);buf = QString(info.absolutePath());buf.append("/");buf.append(info.baseName());    //直接获得文件名buf.append(".bin");qDebug("%s",qPrintable(buf));   //与上面的path变量相同,可直接使用path变量qDebug() << info.filePath();ui->iappathEdit->setText(buf);ui->iapoffsizeEdit->setText(tr("0x00000000"));  //默认偏移量

3.bin文件读取

要主要分为两步:根据路径显示框来获取文件、读取bin文件到程序中。

        QFile readfile(ui->iappathEdit->text());    //要读取的bin文件QFileInfo read_file_info(readfile);         //要读取的bin文件的信息if (!readfile.open(QIODevice::ReadOnly)) {  //只读方式打开bin文件QMessageBox::warning(this, tr("Read File"),tr("Cannot open file:\n%1").arg(ui->iappathEdit->text()));return;}QDataStream BinFileData(&readfile);  //将刚刚创建的 file 对象的指针传递给一个QDataStream实例 BinFileDatachar *pBuff = new char[read_file_info.size()];  //要读取bin文件的大小BinFileData.readRawData(pBuff,static_cast<int>(read_file_info.size()));

这段代码我们看两个地方:
a. readRawData函数解释如下:

这里实现读取数据到pBuff数组。
b. static_cast<int>强制转换:

static_cast相当于传统的C语言里的强制转换,该运算符把expression转换为new_type类型(C++强制类型转换:static_cast)。

这里将read_file_info.size()转换为int数据。

参考文章:C++四种类型转换运算符:static_cast、dynamic_cast、const_cast和reinterpret_cast_C语言中文网。

double scores = 95.5;
int n = static_cast<int>(scores);

4.将读取的bin文件写入到新的文件。

    QString path = QFileDialog::getSaveFileName(this,tr("Open File"),".",tr("Bin Files(*.bin)"));if(!path.isEmpty()) {QFile file(path);if (!file.open(QIODevice::WriteOnly)) {QMessageBox::warning(this, tr("Write File"),tr("Cannot open file:\n%1").arg(path));return;}

首先通过上一小节使用到另存为对话框,设置我们的存储目标文件。然后直接将第3步读取到的数据写入:

        file.write(pBuff);

5.测试运行效果:


左侧是我们用于测试的源bin文件,右侧是通过generate功能生成的新bin文件。可以看到只有部分数据,到00正好结束。根据以往的单片机编程,很容易想到00是一个字符串的结束符。

6.解决00结束符问题

我们打印下读取的文件长度:

qDebug() << static_cast<int>(read_file_info.size());

控制台输出为8,那么问题应该就出在了file.write(pBuff),查看函数原型:

可以看出,写入长度为data字符串的长度,即遇到00结束。我们将代码修改为:

 QByteArray DataAllArray;DataAllArray = QByteArray(pBuff,static_cast<int>(read_file_info.size()));file.write(DataAllArray);

再次测试,结果如下:

GitHub下载

点击打开查看readbin分支。

Qt5学习笔记之bin文件合成工具二:bin文件的读取和写入相关推荐

  1. Qt5学习笔记之零碎问题记录

    目录 概述 1.qDebug输出问题 1.1 qDebug() << "OK"报错 1.2 qDebug打印QString类型 2.QString字符串的操作 3.修改 ...

  2. Qt5学习笔记之QString的使用

    目录 概述 2.QString字符串的操作 2.1 拼接 2.2 裁剪 2.3 转换为int型 2.4 int转换为QString 2.5 小写字母大写字母转换 2.6 转换为16进制 概述 学习过程 ...

  3. Qt5学习笔记之串口助手三:打包成Windows软件

    这里写目录标题 添加图标 打包程序 测试打包好的软件 添加图标 图标的获取可以参考我的另一篇文章:Qt5学习笔记之图标下载和转换,这里只记录下Qt中使用图标的方法. 1.切换到release模式下进行 ...

  4. Qt5学习笔记之串口助手四:增加16进制/ASCII切换、周期发送

    目录 1. 概述 2. 16进制/ASCII发送 2.1 功能实现 2.2 界面修改 3. 接收框显示发送内容 3.1 以16进制/ASCII显示 3.1.1 界面修改 3.1.2 功能实现 3.2 ...

  5. oracle12c口令文件,学习笔记:Oracle 12C ASM 新特性 共享密码文件

    天萃荷净 测试试验ORACLE 12C ASM 新特性 共享密码文件的详细过程 在ORACLE 12C之前大家都知道密码文件是存放在?/dbs或者?/database中,如果要修改修改sysdba权限 ...

  6. 10-1Python学习笔记 10-2C语言学习笔记 : 在文本编辑器中新建一个文件, 写几句话来总结一下你至此学到的Python知识

    10-1 Python学习笔记 : 在文本编辑器中新建一个文件, 写几句话来总结一下你至此学到的Python知识, 其中每一行都以"In Python you can"打头. 将这 ...

  7. Qt5学习笔记之bin文件合成工具一:使用对话框选取本地文件并读取

    这里写目录标题 概述 工具概述 实现步骤 本章总结 概述 经过了前面的QQ登录界面和串口助手,我们已经对QT有了一个初步的认识.视频后半部分是网络和移植部分,打算先不继续学习,在Windows下实现两 ...

  8. Qt5学习笔记之bin文件合成工具三:偏移量数据填充

    这里写目录标题 概述 实现步骤 偏移量获取 数据填充 概述 在上一章节我们实现了单个bin文件的读取和写入,这一节我们实现完整的generate功能.包括读取偏移量,填充无用数据00或FF. 实现步骤 ...

  9. Python3.6学习笔记总结4:错误处理、写文件、JSON、进程、线程

    python书籍推荐 书名:Python编程 从入门到实践作者:[美]埃里克·马瑟斯(Eric,Matthes)京东购买地址:https://item.jd.com/11993134.html 分享m ...

最新文章

  1. 这是什么操作?导师一作,研究生挂通讯...
  2. Laravel/Lumen搭建服务器性能测试
  3. IDEA如何像ecplise一样添加jar包?
  4. php获取压缩文件列表,php获取所有文件并压缩
  5. 简单地使用webpack进行打包,一些常见打包错误
  6. 2021巨量引擎连锁经营行业洞察报告
  7. ram自己写?用IP?
  8. 跟着 Microsoft 跑!
  9. matlab 韩明距离_科学网—Matlab中 pdist 函数详解(各种距离的生成) - 朱新宇的博文...
  10. C/C++[codeup 1805]首字母大写
  11. 计算机打字正确姿势,电脑打字的7个技巧
  12. 全球最强免费电子书下载网址
  13. JAVA打印中文乱码问题
  14. Windows 服务器使用FTP出现“当前的安全设置不允许从该位置下载文件 警告
  15. 本地IP与网络IP的区别与查询方式
  16. js正则表达式 URL格式匹配详解
  17. 刺激战场服务器无响应ios,绝地求生刺激战场IOS系统更新后玩不了 绝地求生刺激战场苹果手机更新后进不去...
  18. 原来当年发葫芦娃种子的才是真正的老司机
  19. java--json与JavaBean,List,Map的使用
  20. 基于python计算包含贝塞尔函数的积分

热门文章

  1. php事务讲解,PHP面向对象之事务脚本模式(详解)
  2. c语言输出字母随机数,你好,怎样用c语言输出一个1到100的随机数
  3. java自动生成函数注释_IDEA类和方法注释自动生成(2019-08-31 21:47写)
  4. java adt is保存快捷键_实用的eclipse adt 快捷键
  5. php fmod小数位数_PHP取余函数介绍MOD(x,y)与x%y
  6. 计算二叉树的叶子结点个数_C++数据结构二叉树统计总结点个数,叶子结点个数,单分支结点个数,双分支结点个数。...
  7. python进程socket通信_python之socket初识
  8. python交互式编程在哪里_终于明了python交互式编程入门
  9. ggplot2作图详解:标尺(scale)设置
  10. 表情识别(六)--局部特征学习和Handcrafted特征结合