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

##工作记录##

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

}

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

  • 24
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不相信眼泪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值