##工作记录##
工作中常用到dat文件与txt文件格式相互转换,这里总结转换函数如下:
*.dat文件转*txt文件
本函数中使用的*.dat文件每行256字节十六进制数据。
void GenTxtFromDat(QString datFilePath, QString txtFilePath)
{
QFile file(datFilePath);
QFile newFile(txtFilePath);
QTextStream newFileSR(&newFile);
if (!(file.open(QIODevice::ReadOnly)))
return;
if (!newFile.open(QFile::ReadWrite | QIODevice::Truncate))
{
return;
}
QByteArray byteBuf = file.readAll();
qint64 fileLen = file.size();
int lineLength = 256;
QString str;
for (int i = 0; i < fileLen / lineLength; i++)
{
for (int j = 0; j < lineLength; j++)
{
unsigned char temp = byteBuf[i*lineLength + j];
QString hexStr = QString("%1").arg(temp, 2, 16, QLatin1Char('0'));
str += hexStr.toUpper();
str += " ";
}
newFileSR << str << endl;
str = "";
}
newFile.close();
}
*.txt文件转*dat文件
本函数中使用的*.txt文件每行256字节十六进制数据。
void GenDatFromTxt(QString txtFilePath, QString datFilePath)
{
QFile file(txtFilePath);
QFile newFile(datFilePath);
if (!(file.open(QIODevice::ReadOnly)))
return;
if (!newFile.open(QFile::ReadWrite | QIODevice::Truncate))
{
return;
}
QByteArray byteBuf = file.readAll();
qint64 fileLen = file.size();
QByteArray removeEnterBuf;
//去掉回车键和空格
for (int i = 0; i < fileLen; i++)
{
if (byteBuf.at(i) == ' ' || byteBuf.at(i) == '\r' || byteBuf.at(i) == '\n')
{
continue;
}
else
{
removeEnterBuf.append(byteBuf[i]);
}
}
QString str;
QList<unsigned char> dataList; //存放将2进制转换为十六进制的全部数据
for (int i = 0; i < removeEnterBuf.size(); i++)
{
str += removeEnterBuf[i];
bool ok;
if ((i + 1) % 2 == 0) //每两个字符为十六进制一个字节
{
dataList.append(str.toInt(&ok, 16));
str = "";
}
}
QByteArray writeBytes;
for (int i = 0; i < dataList.size(); i++)
{
writeBytes.append(dataList[i]);
}
newFile.write(writeBytes);
newFile.close();
}
说明:如果有需要,也可以将每行的数据长度作为一个参数传入,使函数通用性更好。