lengshizai 2024-09-19 20:55 采纳率: 31.7%
浏览 6
已结题

windows c++内嵌qt出现数据转换问题。

请根据调试信息以及代码指出为什么经过qtextedit转换一次,就不匹配,指出问题,并给出解决方案。请着重关注qtextedit操作相关的代码

//输出信息如下:
/*

版本号: 100
文件数量: 20113
偏移位置: 1377057156
文件长度: 999395
这个是二代加密的txt文件! "npcdata.txt" "npcdata.txt"
processVector可逆
读取之后不可逆


*/

void on_pushButtonOpenFile_clicked()
{
 
 
    QFile file(PKG_Path);
    QDataStream in(&file);
 
    // 读取信息
    quint32 version = ReadInt(in);
    quint32 filenums = ReadInt(in);
    quint32 filename_table_offset = ReadInt(in);
    quint32 filename_table_len = ReadInt(in);
 
 
    in.device()->seek(filename_table_offset);
    quint32 max = 0;
    for (quint32 index = 0; index < filenums; ++index) {
        quint16 name_len = ReadShort(in);
        QString name = ReadString(in, name_len);
        quint32 flag = ReadInt(in);
        quint32 offset = ReadInt(in);
        quint32 size = ReadInt(in); // 文件原始的大小
        quint32 zlib_size = ReadInt(in); // 文件压缩后的大小
        quint32 currentPosition = in.device()->pos();
        in.device()->seek(offset);
        QByteArray text(zlib_size, '\0');
        in.readRawData(text.data(), zlib_size);
        in.device()->seek(currentPosition);
 
        QFileInfo fileInfo(name);
        QString extension = fileInfo.suffix();
        if ((extension == "txt" || extension == "lua") && extractFileName(name) == "npcdata.txt") {
            QByteArray decompressedData = decompressUsingStreams(text);
 
            QString privateKey = "";
           QByteArray CeshiJieMi = NULL;
           QByteArray CeshiJiaMi = NULLif (decompressedData.length() > 8 &&
                (uint)(unsigned char)decompressedData[0] == 0x3F &&
                (uint)(unsigned char)decompressedData[1] == 0x3F &&
                (uint)(unsigned char)decompressedData[2] == 0x53 &&
                (uint)(unsigned char)decompressedData[3] == 0x47) {
                privateKey = "reaishenghuo“;
                qDebug() << "这个是二代加密的txt文件!" << name << extractFileName(name);
                decompressedData = decrypt(decompressedData, privateKey.toUtf8());
                 CeshiJieMi = decompressedData;
                 CeshiJiaMi = processVector(decompressedData);
                if (CeshiJieMi == processVector(CeshiJiaMi)) {
                    qDebug() << "processVector可逆";
                }
                else {
                    qDebug() << "processVector不可逆";
                }
            }
            QTextCodec* codec = QTextCodec::codecForName("GBK");
            QString stdstring = codec->toUnicode(decompressedData);
            ui.plainTextEdit->setPlainText(stdstring);
            QString content = ui.plainTextEdit->toPlainText();
            QByteArray contentArray = codec->fromUnicode(content);
            contentArray = processVector(contentArray);
            if (contentArray == CeshiJiaMi) {
                qDebug() << "读取之后可逆";
            }
            else {
                qDebug() << "读取之后不可逆";
          }
            decompressedData.clear();
        }
    }
}
QByteArray processVector(const QByteArray& data) {
    QByteArray result = data; // 创建一个副本
    if (result.isEmpty()) {
        return result;
    }
    int length = result.size();
    int index = 0;
    int tempIndex = length - 1;
    while (index <= tempIndex) {
        uchar byteOne = result[tempIndex];
        uchar byteTwo = result[index];
        byteOne ^= 0x23;
        byteTwo ^= 0x23;
        result[index] = byteOne;
        result[tempIndex] = byteTwo;
        ++index;
        --tempIndex;
    }
    return result;
}
//ui.plainTextEdit->setPlainText(stdstring) 和 ui.plainTextEdit->toPlainText()
//为什么经过这两部数据就变了   不应该一样的吗,请为我给出解决方法,不要搬AI   试过了  不好用
  • 写回答

20条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-09-19 20:59
    关注

    以下回复引自免费微信小程序:皆我百晓生。 如问题解决,还请采纳。如仍有疑问,请回复留言或私信博主,以便获得更精准的帮助。

    在C++中,QT是一个重要的库,用于图形用户界面(GUI)开发。QT可以用来处理文本编辑器(QT TEXT EDITOR)。然而,在一些情况下,可能需要进行数据转换以确保QT的正确运行。例如:

    1. 如果你的QT应用程序使用的是QT5或QT6,那么你可能需要将输入字符串转换为QT的字符串格式以便于操作。

    2. 如果你的QT应用程序使用的是QT4或者QT5,那么你可能需要将输入字符串转换为QT的字符串格式以便于操作。

    3. 如果你的QT应用程序使用的是QT7或者QT8,那么你可能需要将输入字符串转换为QT的字符串格式以便于操作。

    在这种情况下,你可以尝试以下方法来解决这个问题:

    1. 使用QT::FROMUTF8()函数将输入字符串转换为QT的字符串格式。

    2. 在你的程序中添加一个判断语句,检查输入字符串是否符合QT的字符串格式要求。

    3. 如果你的QT应用程序不支持QT5,你可以考虑使用QT5中的QTEXTCODEC类来处理输入字符串。

    如果你的代码中没有包含上述任何方法,那么你需要提供更多的上下文信息,这样我才能更准确地帮助你解决问题。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(19条)

报告相同问题?

问题事件

  • 系统已结题 10月1日
  • 已采纳回答 9月23日
  • 修改了问题 9月19日
  • 创建了问题 9月19日

悬赏问题

  • ¥45 字符串操作——数组越界问题
  • ¥15 Loss下降到0.08时不在下降调整学习率也没用
  • ¥30 怎么把PCK、OKS指标添加到yolov11中
  • ¥15 QT+FFmpeg使用GPU加速解码
  • ¥15 为什么投影机用酷喵播放电影放一段时间就播放不下去了?提示发生未知故障,有什么解决办法吗?
  • ¥15 来个会搭建付费网站的有偿
  • ¥100 有能够实现人机模式的c/c++代码,有图片背景等,能够直接进行游戏
  • ¥20 校园网认证openwrt插件
  • ¥15 以AT89C51单片机芯片为核心来制作一个简易计算器,外部由4*4矩阵键盘和一个LCD1602字符型液晶显示屏构成,内部由一块AT89C51单片机构成,通过软件编程可实现简单加减乘除。
  • ¥15 求GCMS辅导数据分析