Qt 對(duì)bin奔则,Hex文件的讀寫(xiě)
? 項(xiàng)目需要將bin文件和Hex文件合并到一個(gè)并一個(gè)bin文件中,并保留Hex的原始信息蔽午。因?yàn)閮蓧KMCU使用不同的文件進(jìn)行升級(jí)易茬,并且是主MCU給副MCU升級(jí),主MCU通過(guò)OTA獲取更新文件及老。
-
目標(biāo)文件的選擇
為了獲取文件的路徑抽莱,為后續(xù)文件的讀寫(xiě)做準(zhǔn)備。
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("打開(kāi)Bin文件發(fā)生錯(cuò)誤骄恶!")); 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會(huì)打開(kāi)一個(gè)對(duì)話(huà)框食铐,用于選擇文件
arg1:父對(duì)象
arg2:窗口標(biāo)題
arg3:‘’./‘表示打開(kāi)當(dāng)前程序運(yùn)行的路徑;‘’/‘’表示當(dāng)前程序路徑的根目錄
arg4:選擇的文件類(lèi)型
fileName獲取的是用戶(hù)選擇的文件的路徑僧鲁,未選中任何文件虐呻,則為空。
QMessageBox用于輸出各類(lèi)提示信息寞秃,提示框使用請(qǐng)自行百度铃慷。
使用路徑初始化QFileInfo對(duì)象可以獲取文件的各類(lèi)信息。
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("無(wú)法讀取,請(qǐng)檢查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("無(wú)法讀取,請(qǐng)檢查Hex文件路徑!"));
return;
}
可以看出對(duì)Bin文件和Hex文件的讀取使用不同的方式蜕该;bin文件中的儲(chǔ)存的是數(shù)據(jù),有些值是不能被顯示的洲鸠,如果使用QTextStream讀取堂淡,對(duì)于某些不可見(jiàn)字符,就會(huì)被忽略扒腕,造成讀取到的bin文件數(shù)據(jù)丟失绢淀。
-
文件的寫(xiě)入
獲取到文件的數(shù)據(jù),將兩個(gè)文件都放入一個(gè)緩沖區(qū)瘾腰,在寫(xiě)入一個(gè)新的文件中即可皆的。
QFile newFile(mFileInfo.outputPath
+ "\\" //注:雙斜杠
+ mFileInfo.BinFileInfo.baseName() //去除后綴
+ "_"
+ mFileInfo.HexFileInfo.baseName()
+ ".bin");
newFile.open(QIODevice::ReadWrite); //創(chuàng)建新文件
newFile.write(buffPack); //buffPack保存了合并文件的數(shù)據(jù)
qDebug() << "文件寫(xiě)入完成";
newFile.close();
在保存為文件之前,可以任意修改文件的數(shù)據(jù)蹋盆,比如需要修改指定位置的數(shù)據(jù)费薄。