#include "mainwindow.h" #include "ui_mainwindow.h" #include #include #include #include #include #include #include #include MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow) { ui->setupUi(this); folderPath = ""; } MainWindow::~MainWindow() { delete ui; } void MainWindow::ReadDat(QString fileName) { int year = ui->yearSpinBox->value(); int month = ui->monthSpinBox->value(); int day = ui->daySpinBox->value(); //转化为16进制 uint8_t hexYear = IntToHex(year); uint8_t hexMonth = IntToHex(month); uint8_t hexDay = IntToHex(day); //QString filename = outputDir+"/"+fileName; // // 一个示例日期,年月日分别为2023年、12月、3日 // QDate date(year+2000, month, day); // // 将日期格式化为yymmdd // QString formattedDate = date.toString("yyyyMMdd"); // //修改文件名的时间信息 // QString f1 = fileName; // f1.remove(11,f1.length()-11); // QString f2 = fileName; // f2.remove(0,11+8); // QString str = f1+formattedDate+f2; QString outputFileName = GetOutputFileName(fileName,year,month,day); //创建修改后的dat文件 QFile writeFile(outputDir+"/"+outputFileName); QDataStream outStream; if (writeFile.open(QIODevice::WriteOnly)) { // 创建数据流,用于写入二进制数据 // outStream = QDataStream(&writeFile); outStream.setDevice(&writeFile); outStream.setByteOrder(QDataStream::LittleEndian); } int len = 265; quint8 *data = new quint8[len]; QFile file1 = QFile(folderPath+"/"+fileName); //QFile file1 = QFile("E:\\dat\\output\\下行遥测_0_1_0_20230619230109.dat"); file1.open(QIODevice::ReadOnly); QDataStream readStream = QDataStream(&file1); readStream.setVersion(QDataStream::Qt_5_15); //设置数据流的版本 readStream.setByteOrder(QDataStream::LittleEndian); int i =0; quint8* content = new quint8[28]; //创建一个28字节的数据缓冲区 // int sub1 = 0; // int sub2 = 0; while(!readStream.atEnd()) { readStream.readRawData((char *)data, len); //读取一帧 // i++; //四个子帧解析 // int id1 = 16; // int id2 = id1+32; // int id3 = id2+32; // int id4 = id3+32; int startID = 16; for (int var = 0; var < 4; ++var) { startID = 16 + 32*var; // if(data[startID]!=0x23) // qDebug()<<"************Zhen1:"<0) data[startID+18] = hexDay; if(hexMonth>0) data[startID+19] = hexMonth; if(hexYear>0) data[startID+20] = hexYear; //计算CRC16校验位 for(int i=0;i<28;i++)//提取数据帧内容 { content[i] = data[startID+2+i]; } quint16 crc = GetCrcSum(content,28);//计算校验码 // 提取高位和低位 quint8 highByte = static_cast((crc >> 8) & 0xFF); quint8 lowByte = static_cast(crc & 0xFF); //修改CRC校验位 data[startID+30] = lowByte; data[startID+31] = highByte; } } } // bool b = data[16]==0x23; // bool b1 = data[17]==0x23; // bool b2 = data[18]==0x85; //修改系统时间戳 if(hexYear>0) data[2] = hexYear; if(hexMonth>0) data[3] = hexMonth; if(hexDay>0) data[4] = hexDay; //修改最后校验位 data[len-1] = GetDataCheckCRC(data,len); //写入文件 outStream.writeRawData((char *)data,len); } file1.close(); writeFile.close(); qDebug()<<"*********************i:"<= 1 && day <= 29) { return true; } } else { if (day >= 1 && day <= 28) { return true; } } } else if (month == 4 || month == 6 || month == 9 || month == 11) { if (day >= 1 && day <= 30) { return true; } } else { if (day >= 1 && day <= 31) { return true; } } return false; } QString MainWindow::GetOutputFileName(QString fileName,int year, int month, int day) { //QString str = "下行遥测_0_17_0_20221114024453.dat"; QStringList strList = fileName.split("_"); QString endstr = strList.constLast(); QString lastStr = endstr.mid(8,-1); if(year==0) year = endstr.mid(0,4).toInt()-2000; //QString year0 = endstr.mid(0,4); if(month==0) month = endstr.mid(4,2).toInt(); if(day==0) day = endstr.mid(6,2).toInt(); // QString month = endstr.mid(4,2); // QString day = endstr.mid(6,2); // 一个示例日期,年月日分别为2023年、12月、3日 QDate date(year+2000, month, day); // 将日期格式化为yymmdd QString formattedDate = date.toString("yyyyMMdd"); QString outputFileName = ""; strList.removeLast(); strList.append(formattedDate); outputFileName = strList.join("_") + lastStr; // for (int var = 0; var < strList.length()-2; ++var) { // outputFileName += strList.at(var); // } return outputFileName; } void MainWindow::on_openDirBtn_clicked() { // 创建一个QFileDialog对象 QFileDialog dialog; // 设置对话框的标题 dialog.setWindowTitle("Select Folder"); // 设置对话框模式为选择文件夹 dialog.setFileMode(QFileDialog::Directory); // 打开对话框 if (dialog.exec()) { // 获取用户选择的文件夹路径 folderPath = dialog.selectedFiles().at(0); qDebug() << "Selected Folder: " << folderPath; } else { qDebug() << "User canceled the operation."; } } void MainWindow::CreateDir() { // 创建一个QDir对象 QDir dir; outputDir = folderPath+"/output"; // 设置目录路径 dir.setPath(outputDir); // 创建文件夹 if (dir.mkpath(outputDir)) { qDebug() << "Folder created successfully."; } else { qDebug() << "Failed to create folder."; } //QDir directory(folderPath+"/output"); } void MainWindow::on_startModifyBtn_clicked() { int year = ui->yearSpinBox->value(); int month = ui->monthSpinBox->value(); int day = ui->daySpinBox->value(); if(year<=0&&month<=0&&day<=0) { QMessageBox::information(NULL,"提示","请设置要修改的年月日!!!"); return; } if(folderPath=="") { QMessageBox::information(NULL,"提示","请先设置文件夹!!!"); return; } // 检查Day是否正确 if(day>0 && !isValidDay(year+2000,month,day)) { QMessageBox::information(NULL,"提示","日期有误,请重新设置!!!"); return; } // 创建一个 QDir 对象 QDir directory(folderPath); // 获取文件夹中的所有文件 QStringList files = directory.entryList(QDir::Files); int numFiles = files.length(); if(numFiles==0) { QMessageBox::information(NULL,"提示","该文件夹没有dat文件!!!"); return; } //新建output文件夹 CreateDir(); //开始处理 for (int n = 0; n < numFiles; ++n) { ReadDat(files.at(n)); } QMessageBox::information(NULL,"提示","处理结束!!!"); }