《VS+QT》dat文件与txt文件相互转换

发布于:2024-05-14 ⋅ 阅读:(155) ⋅ 点赞:(0)

##工作记录##

工作中常用到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();

}

说明:如果有需要,也可以将每行的数据长度作为一个参数传入,使函数通用性更好。


网站公告

今日签到

点亮在社区的每一天
去签到