lengshizai 2024-02-16 13:06 采纳率: 31.7%
浏览 22
已结题

C++内存字符串数据读取并对比

想要读取一个内存地址(自己设定的)字符串数据,并与既定字符串对比,但是一直报错,具体代码如下:

//代码1:对比字母字符串
DWORD Function::字符串对比(QString 既定字符串) 
{    //假定 既定字符串="woaiGuoJia"
    //假定 内存地址存的字符串="GuoJiaaiwo"
    DWORD 内存地址 = 0x1234567;
    QString 字符串 = (CHAR*)(DWORD*)内存地址;   //加上这句代码就崩溃,并且读出的字符串是乱码 
    if (既定字符串 == 字符串)
    {
        printf("匹配成功");
    }
}

//代码2:对比汉字
DWORD Function::字符串对比(QString 既定字符串) 
{    //假定 既定字符串="我爱国家"
    //假定 内存地址存的字符串="国家爱我"
    DWORD 内存地址 = 0x1234567;
    std::string  字符串输出 = (CHAR*)内存地址;  
        printf("#define %s\n",字符串输出.c_str());  //这句以上都没问题,输出的是“国家爱我”
        QString 字符串 = (CHAR*)(DWORD*)内存地址;  //同样是这句报错,一带上这句及下面代码程序就崩溃
    if (既定字符串 == 字符串)
    {
        printf("匹配成功");
    }
}

想要达成的目的就是对比 内存地址的字符串是不是既定字符串,请修改我的代码 并作出相应解释。

另外 请列举内存读取的几种方法 例如(dword)这种简单的,我自己做的工作小程序就卡这一部分了
初学外行者,工作需要,请指教。

  • 写回答

22条回答 默认 最新

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

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

    在 C++ 中,从内存地址读取字符串并进行对比时需要格外小心。您提供的代码存在几个关键问题:

    1. 您不能直接将内存地址转换为字符串类型,因为您没有提供关于该地址存储的字符串长度信息。如果内存中的字符串不是以空字符(\0)结尾,则无法正确识别字符串边界。

    针对您的需求,这里是一个修改后的示例,它使用了 std::string 并假设内存中存储的是一个以空字符结尾的标准 C 风格字符串:

    #include <iostream>
    #include <string>
    
    // 假设内存地址存的是以'\0'结尾的字符串
    DWORD memoryAddress = 0x1234567;
    
    bool Function::compareStrings(const std::string& expected)
    {
        // 创建一个char指针指向内存地址
        const char* memoryString = reinterpret_cast<const char*>(memoryAddress);
    
        // 使用std::string构造函数从内存中读取字符串
        std::string actual(memoryString);
    
        // 对比两个字符串
        if (expected == actual)
        {
            std::cout << "匹配成功" << std::endl;
            return true;
        }
        else
        {
            return false;
        }
    }
    
    int main()
    {
        std::string predefinedString = "我爱国家";
        
        // 调用函数进行比较
        Function functionInstance;
        if (functionInstance.compareStrings(predefinedString))
        {
            // 匹配成功处理
        }
        else
        {
            // 匹配失败处理
        }
    
        return 0;
    }
    

    请注意:

    • 上述代码假设内存地址处存储的是标准C风格的null-terminated字符串。
    • 在实际应用中,你必须确保内存地址有效且可读,并且你有权限访问它。
    • 如果要处理Unicode字符串(如UTF-8或宽字符),则需采用不同的方法,例如使用std::wstringwchar_t

    对于内存读取的其他方法,请参考以下几种常见的做法:

    • 静态数组:直接通过数组索引读取已知大小的内存区域。
    • 动态分配的内存:通过指针访问new[]分配的内存区域。
    • 结构体/类成员:通过对象实例访问其内部的数据成员。
    • 文件映射:通过CreateFileMappingMapViewOfFile等Windows API函数映射文件到进程空间进行读取。
    • 共享内存:在多个进程间创建共享内存区域,通过OpenFileMappingMapViewOfFile等API进行读写。

    由于你的上下文是C++而非特定于某个平台的API,上述示例仅涉及基本的内存操作。如果你需要处理特定平台的功能,如Win32 API的内存操作,请提供更详细的需求。

    评论 编辑记录

报告相同问题?

问题事件

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

悬赏问题

  • ¥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