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

C++ 内嵌QT 数据转换

为什么数据转换中出现改变,请为我指出问题并给出解决方案
输出信息如下:

版本号: 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   试过了  不好

  • 写回答

1条回答 默认 最新

  • 一轮明月照丘壑 2024-09-19 21:00
    关注

    以下回复参考:皆我百晓生券券喵儿等免费微信小程序作答:

    根据您提供的代码和描述,看起来问题可能出现在数据处理的过程中。您提到的“ui.plainTextEdit->setPlainText(stdstring) 和 ui.plainTextEdit->toPlainText()”之间数据变化的问题,可能是由于编码转换或者数据处理过程中的一些细节导致的。这里有几个可能的问题和解决方案:

    1. 编码转换问题: 您在读取数据后使用了QTextCodec进行编码转换。请确保您在转换前后使用的编码方式是一致的,避免因为编码不一致导致的乱码或数据变化问题。您可以尝试在整个数据处理过程中只使用一种编码方式,比如UTF-8。
    2. 解密与再次加密问题: 在您的代码中,您在解密后将处理后的数据再次进行了处理(即使用processVector函数)。如果processVector函数对数据的修改是不可逆的,那么在读取后数据可能会发生变化。您需要确保processVector函数的处理是可逆的,或者至少在读取数据后不需要再次应用此处理。
    3. 内存管理问题: 请确保在处理数据时正确管理内存。特别是当您使用QByteArray时,确保没有意外地修改或释放其他不应该修改的内存区域。有时候,不正确的内存管理也可能导致数据变化。
    4. 文本编辑控件的使用问题: 关于ui.plainTextEdit->setPlainText(stdstring)ui.plainTextEdit->toPlainText()之间数据变化的问题,可能是因为您在设置文本后又进行了其他操作(比如编辑、滚动等),导致再次获取文本时发生了变化。您可以尝试在设置文本后不进行其他操作,直接获取文本进行对比。

    针对这些问题,您可以尝试以下解决方案:

    • 确保编码转换的一致性。
    • 检查并调整processVector函数的实现,确保它是可逆的或者不需要在读取数据后再次应用。
    • 仔细检查内存管理,确保没有意外修改或释放内存。
    • 在设置文本后不进行其他操作,直接对比读取的文本是否发生变化。

    如果这些方案不能解决问题,可能需要更深入地调试您的代码,特别是关注数据处理和内存管理的部分。

    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 9月23日
  • 创建了问题 9月19日

悬赏问题

  • ¥15 如何在vue.config.js中读取到public文件夹下window.APP_CONFIG.API_BASE_URL的值
  • ¥50 浦育平台scratch图形化编程
  • ¥20 求这个的原理图 只要原理图
  • ¥15 vue2项目中,如何配置环境,可以在打完包之后修改请求的服务器地址
  • ¥20 微信的店铺小程序如何修改背景图
  • ¥15 UE5.1局部变量对蓝图不可见
  • ¥15 一共有五道问题关于整数幂的运算还有房间号码 还有网络密码的解答?(语言-python)
  • ¥20 sentry如何捕获上传Android ndk 崩溃
  • ¥15 在做logistic回归模型限制性立方条图时候,不能出完整图的困难
  • ¥15 G0系列单片机HAL库中景园gc9307液晶驱动芯片无法使用硬件SPI+DMA驱动,如何解决?