Qt 对bin,Hex文件的读写
项目需要将bin文件和Hex文件合并到一个并一个bin文件中,并保留Hex的原始信息。因为两块MCU使用不同的文件进行升级,并且是主MCU给副MCU升级,主MCU通过OTA获取更新文件。
-
目标文件的选择
为了获取文件的路径,为后续文件的读写做准备。
include <QFileDialog>
QString fileName = QFileDialog::getOpenFileName( this, tr("Select KW35 Bin file"), "./", tr("bin file(*.bin)")); if(fileName.isEmpty()){ QMessageBox mesg; mesg.critical(this,tr("Error"),tr("打开Bin文件发生错误!")); return; }else{ //qDebug()<< "path :" << fileName; ui->lineEdit_BinPath->setText(fileName); } QFileInfo *fileInfo = new QFileInfo(fileName); mFileInfo.BinFileInfo = *fileInfo; ui->label_KW35BinSize->setText("KW35 Bin Size:" + QString::number(mFileInfo.BinFileInfo.size()));
QFileDialog::getOpenFileName会打开一个对话框,用于选择文件
arg1:父对象
arg2:窗口标题
arg3:‘’./‘表示打开当前程序运行的路径;‘’/‘’表示当前程序路径的根目录
arg4:选择的文件类型
fileName获取的是用户选择的文件的路径,未选中任何文件,则为空。
QMessageBox用于输出各类提示信息,提示框使用请自行百度。
使用路径初始化QFileInfo对象可以获取文件的各类信息。
bin文件的读取
QFile *file = new QFile;
/*
* 读取Bin文件
*/
file->setFileName(mFileInfo.BinFileInfo.filePath());
if(file->open(QIODevice::ReadOnly)){
QDataStream BinFileData(file);
char *pBuff = new char[mFileInfo.BinFileInfo.size()];
BinFileData.readRawData(pBuff,static_cast<int>(mFileInfo.BinFileInfo.size()));
mFileInfo.BinFileRawData = QByteArray(pBuff,static_cast<int>(mFileInfo.BinFileInfo.size()));
//qDebug()<< mFileInfo.BinFileRawData;
file->close();
}else {
QMessageBox mesg;
mesg.critical(this,tr("Error"),tr("无法读取,请检查BIN文件路径!"));
return;
}
- hex文件的读取
/*
* 读取hex文件
*/
file->setFileName(mFileInfo.HexFileInfo.filePath());
if(file->open(QIODevice::ReadOnly)){
QTextStream HexFileData(file);
mFileInfo.HexFileRawData = HexFileData.readAll().toLocal8Bit();
//qDebug()<< mFileInfo.HexFileRawData;
file->close();
}else{
QMessageBox mesg;
mesg.critical(this,tr("Error"),tr("无法读取,请检查Hex文件路径!"));
return;
}
可以看出对Bin文件和Hex文件的读取使用不同的方式;bin文件中的储存的是数据,有些值是不能被显示的,如果使用QTextStream读取,对于某些不可见字符,就会被忽略,造成读取到的bin文件数据丢失。
-
文件的写入
获取到文件的数据,将两个文件都放入一个缓冲区,在写入一个新的文件中即可。
QFile newFile(mFileInfo.outputPath
+ "\\" //注:双斜杠
+ mFileInfo.BinFileInfo.baseName() //去除后缀
+ "_"
+ mFileInfo.HexFileInfo.baseName()
+ ".bin");
newFile.open(QIODevice::ReadWrite); //创建新文件
newFile.write(buffPack); //buffPack保存了合并文件的数据
qDebug() << "文件写入完成";
newFile.close();
在保存为文件之前,可以任意修改文件的数据,比如需要修改指定位置的数据。