lengshizai 2024-02-21 19:09 采纳率: 31.7%
浏览 12
已结题

C++ QT内存数据匹配对比指导

由于之前请教时没有附带内存数据,本次我直接拷贝了一份内存数据出来;
待定问题:复制出的内存数据(字符串)编码形式不限,请协助判断;
目的:对比 内存字符串 与目标字符串;

要求:请仔细阅读代码并给出指导性建议或方法,不要水评论。学习时间很宝贵。
源代码如下:

#include <QtCore/QCoreApplication>
#include <QDebug>
#include <Windows.h>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    

    QString str2 = "我爱中国";
    qDebug() << "str2=" << str2 << endl;
    qDebug() << "toUtf8" << str2.toUtf8() << endl;
    qDebug() << "toLatin1" << str2.toLatin1() << endl;
    qDebug() << "toLocal8bit" << str2.toLocal8Bit() << endl;

    std::string str = "我爱中国";
    printf("%s\n\n", str);  //修改点1
    printf("%s\n\n", str.c_str());// 就是协助打印出 str
    qDebug() << "str=" << str.c_str() << endl;

   DWORD 内存地址 = (DWORD)malloc(8);
   //二进制:CE D2 B0 AE D6 D0 B9 FA

   *(DWORD*)内存地址 = 0xAEB0D2CE;
   *(DWORD*)(内存地址+0x4) = 0xFAB9D0D6;
   std::string 解析字符串1 = (char*)内存地址;
   printf("STRING 1:%s\n\n", 解析字符串1.c_str());
   if(str == 解析字符串1.c_str())
   {    //解释 为何 str != 解析字符串1
       //如果是编码的原因  该如何解决使我达到匹配对比的目的
       printf("STRING 1:%s\n\n", 解析字符串1.c_str());
   }
   else
   {
       printf("Failed Matching\n\n");   
   }

   QString 解析字符串2 = (char*)内存地址;

   //修改本句代码  使读取出解析字符串2并与 str2对比
   //注意 如果存在编码问题时,需给出相应的解决办法;
   if (str2 == 解析字符串2)
   {
       printf("Successful Matching\n\n"); 
   }
   else
   {
       printf("Failed Matching\n\n");
   }

    return a.exec();
}

结果如下所示:

img


还请不要随便找个GPT结果 请给出指导性建议;上个问题由于很多水答案的可能要结题。谢谢各位。
尽可能 通俗易懂,谢谢

  • 写回答

17条回答 默认 最新

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

    引自免费微信小程序:皆我百晓生

    这段代码试图从内存中解析字符串并进行匹配对比。首先,我们分析一下当前存在的问题和编码情况:

    1. QString str2std::string str 都初始化为 "我爱中国",它们是 UTF-8 编码的中文字符串。

    2. 通过分配内存并手动填充二进制数据到内存地址,模拟了内存中的一个字符串。这里的数据 "CE D2 B0 AE D6 D0 B9 FA" 对应的是 GBK 编码的 "我爱中国"。

    3. 当你将内存地址强制转换为 std::stringQString 并尝试与原字符串比较时,由于没有指定正确的编码,导致无法正确解码内存中的字符串。

    为了修复这个问题并实现正确匹配,你需要确保在将内存数据转换为 std::stringQString 时指定了正确的编码。以下是修改后的代码示例:

    #include <QtCore/QCoreApplication>
    #include <QDebug>
    #include <Windows.h>
    
    int main(int argc, char *argv[])
    {
        QCoreApplication a(argc, argv);
    
        QString str2 = "我爱中国";
        qDebug() << "str2=" << str2 << endl;
        qDebug() << "toUtf8" << str2.toUtf8().toHex() << endl; // 显示 Utf8 的十六进制形式
    
        std::string str = "我爱中国";
    
        DWORD memoryAddress = (DWORD)malloc(8);
        // 内存中的数据是 GBK 编码的 "我爱中国"
        *(DWORD*)memoryAddress = 0xAEB0D2CE;
        *(DWORD*)(memoryAddress + 4) = 0xFAB9D0D6;
    
        // 将内存中的 GBK 编码数据转换为 std::string,并以 GBK 解码
        std::string decodedStr1(reinterpret_cast<char*>(memoryAddress), 8);
        std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>> converter;
        std::wstring wideStr1 = converter.from_bytes(decodedStr1, decodedStr1 + 8, "GBK");
        std::string str1Utf8 = converter.to_bytes(wideStr1);
    
        printf("STRING 1:%s\n", str1Utf8.c_str());
        if (str == str1Utf8)
        {
            printf("Successful Matching with std::string\n");
        }
        else
        {
            printf("Failed Matching with std::string\n");
        }
    
        // 将内存中的 GBK 编码数据转换为 QString,并以 GBK 解码
        QByteArray byteArr(reinterpret_cast<char*>(memoryAddress), 8);
        QTextCodec* codec = QTextCodec::codecForName("GBK");
        QString decodedStr2 = codec->toUnicode(byteArr);
    
        if (str2 == decodedStr2)
        {
            printf("Successful Matching with QString\n");
        }
        else
        {
            printf("Failed Matching with QString\n");
        }
    
        free(reinterpret_cast<void*>(memoryAddress));
    
        return a.exec();
    }
    

    上述代码中,我们首先明确内存中的数据是 GBK 编码,然后分别使用 C++ 标准库(通过 std::wstring_convert)和 Qt 库(通过 QTextCodec)将内存中的 GBK 编码数据解码为 UTF-8 编码的字符串。这样就可以正确地与原始的 std::stringQString 进行匹配对比了。

    评论 编辑记录

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 2月22日
  • 修改了问题 2月21日
  • 创建了问题 2月21日

悬赏问题

  • ¥15 软件工程用例图的建立(相关搜索:软件工程用例图|画图)
  • ¥15 如何在arcgis中导出拓扑关系表
  • ¥15 处理数据集文本挖掘代码
  • ¥15 matlab2017
  • ¥15 在vxWorks下TCP/IP编程,总是connect()报错,连接服务器失败: errno = 0x41
  • ¥15 AnolisOs7.9如何安装 Qt_5.14.2的运行库
  • ¥20 求:怎么实现qt与pcie通信
  • ¥50 前后端数据顺序不一致问题,如何解决?(相关搜索:数据结构)
  • ¥15 基于蒙特卡罗法的中介效应点估计代码
  • ¥15 罗技G293和UE5.3