【问题标题】:Get Byte from memory address?从内存地址获取字节?
【发布时间】:2016-07-03 15:30:07
【问题描述】:

我仍在学习 c++ 并花了几个小时试图找出一种方法来获取存储在某个内存地址的字节,在我的情况下,所有(嗯,几乎所有)内存地址都不是动态的 - 所以地址指向例如,变量不会改变。

所以我试图检索存储在已知内存地址的单个字节。 例如,假设:0x20000

例如,我要检索的字节是0xEF

现在我将如何在不使用取消引用运算符的情况下检索字节? 所以基本上我需要得到0xEF,而不必声明它是什么类型的数据类型,就像字面上只是物理地得到字节0xEF。 希望这是有道理的,我是个菜鸟:/

【问题讨论】:

  • uint8_t mybyte = *reinterpret_cast<uint8_t *>(0x20000);
  • 当你说0xEF是内存位置0x20000的偏移量?
  • 如果 Galik 是正确的,那么在我之前发布的表达式中添加 0xef
  • @md5i 你的第一条消息就是我要找的:) 如果你把它贴在下面我会把它标记为答案!不过感谢您的帮助:)

标签: c++ memory byte memory-address


【解决方案1】:

现在我将如何在不使用取消引用运算符的情况下检索字节?

如果不取消引用访问的地址,您将无法执行此操作。您可以处理的最小数据类型是char。对于字节,通常使用typedef unsigned char uint8_t

因此,您必须使用reinterpret_cast<uint8_t*>(addr) 访问内存地址并取消引用才能获取值。

【讨论】:

    【解决方案2】:

    取消引用内存地址是获取字节值的唯一方法。

    将内存地址类型转换为类型化指针然后解除引用是最直接的方式,例如:

    unsigned char value = *(reinterpret_cast<unsigned char*>(0x20000));
    

    但是,回答您的问题:

    如何在不使用解引用运算符的情况下检索字节

    您可以使用memcpy() 或类似函数间接取消引用内存,例如:

    #include <cstring>
    
    unsigned char value;
    std::memcpy(&value, (void*)0x20000, 1);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-01-18
      • 2018-09-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-05
      • 2013-10-21
      相关资源
      最近更新 更多