【问题标题】:c++: Storing an adress as stringc ++:将地址存储为字符串
【发布时间】:2013-06-02 14:52:14
【问题描述】:

我正在尝试将指针的地址存储为字符串。换句话说,我想将构成 address 的字节的内容插入到 char 向量中。

最好的方法是什么?

我需要一个完全可移植的方法,包括 64 位系统。

【问题讨论】:

  • 将每个字符(即地址)添加到向量中?
  • @Dineshkumar,现在清楚了吗?
  • 如果指针的值(即对象的地址)是“001AFA8C” - 期望的输出是什么样的?字符向量可以包含十六进制表示的单个字符(“8”和“C”等)或十进制数字形式的实际字节(“8C”为“140”等)。
  • @Niko,我还没有想到第一个选项。其实……两者都适合我的需要。

标签: c++ string pointers casting


【解决方案1】:

要获取地址的实际字节的数组(或向量,如果您愿意的话),这应该可以解决问题:

int foo = 10;
int* bar = &foo;

// Interpret pointer as array of bytes
unsigned char const* b = reinterpret_cast<unsigned char const*>(&bar);

// Copy that array into a std::array
std::array<unsigned char, sizeof(void*)> bytes;
std::copy(b, b + sizeof(void*), bytes.begin());

为了得到一个包含十六进制表示的数组,分成单个字符(无论什么意义),我会使用字符串流 - 正如其他一些人已经建议的那样。您也可以使用 snprintf 来获取地址的字符串表示形式,但这更像是 C 风格的方式。

// Turn pointer into string
std::stringstream ss;
ss << bar;
std::string s = ss.str();

// Copy character-wise into a std::array (1 byte = 2 characters)
std::array<char, sizeof(void*) * 2> hex;
std::copy(s.begin(), s.end(), hex.begin());

【讨论】:

  • 我只是好奇,十六进制表示的字符是怎么获取的?
【解决方案2】:

最简单的方法是做

char buf[sizeof(void*) * 2 + 3];
snprintf(buf, sizeof(buf), "%p", /* the address here */ );

【讨论】:

  • 感谢您的回答。为什么是32?它不是比需要的大吗?
  • @Subway 这太多了,但它现在可以在任何平台上运行。我正在以便携的方式进行编辑。
  • 32 位使用 8+1,64 位使用 16+1,因此此方法最多允许 128 位,但在这种情况下它不会有 null-cap。您可以根据平台调整缓冲区大小,例如char buf[sizeof(size_t)*2+1].
  • @Guillaume 是吗?嗯,我常用的参考网站让我失望了。
  • 在这种情况下,我建议使用这种替代格式字符串:snprintf( buf, sizeof(buf), "%*zx", sizeof(size_t) * 2, (size_t) myPointerHere );,它不会打印毫无意义的0x
【解决方案3】:
std::string serialized (std::to_string ((intptr_t) ptr));

【讨论】:

  • 谢谢阿特姆。难道没有比 c-style 转换更好的 c++ 转换吗?
  • 地铁,这是一个品味问题。有时,不那么冗长的版本更容易阅读。如果您喜欢不同的指南,请随意使用。
  • Subway,intptr_t 是 C 风格(来自stdint.h)。如果您愿意,可以使用std::intptr_t
  • 谢谢。我不想问关于使用 std::intptr_t,而是关于使用 c++ 转换,如reinterpret_cast 或其他之一。你能告诉我哪一个适合这种情况吗?
【解决方案4】:

C++ 方法是使用字符串流

#include <string>
#include <sstream>

int main()
{
    MyType object;
    std::stringstream ss;
    std::string result;

    ss << &object; // puts the formatted address of object into the stream
    result = ss.str(); // gets the stream as a std::string

    return 0;

}

【讨论】:

    【解决方案5】:
    void storeAddr(vector<string>& v,void *ptr)
    {
        stringstream s;
        s << (void*)ptr ;
        v.push_back(s.str());
    }
    

    【讨论】:

    • 这里的演员什么都不做;它从void* 转换为void*
    猜你喜欢
    • 1970-01-01
    • 2011-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-22
    相关资源
    最近更新 更多