C++读取内存地址上的一些字节,输出为字符串

C++ reading some bytes at a memory address, output as string

本文关键字:字节 输出 字符串 内存 读取 地址 C++      更新时间:2023-10-16

函数从未知DLL返回指针和长度(通过参数(。

Result = SpamnEggs( &pBytes, &nBytes )

指针指向有效的内存地址,该地址是 nBytes 的连续字节。这些字节包含文本的有效 ascci 值。没有空终止!

我的任务是在输出之前在通用C++代码(没有复杂的库或使用字节(中以尽可能少的简单操作"ovelay"某种字符串类型:

cout << sresult

添加:无需复制字节,因为这是一个必须遍历的大型缓冲区。

原型:

int SpamnEggs( void* pBytes, void* nBytes );
becomes
int SpamnEggs( char** pBytes, int* nBytes );

非常感谢大家。很棒的答案,一切都非常有效。

您可以复制原始内存并自行添加字符串终止字符:

char* newStr = new char[size + 1];
memcpy ( newStr, source, size );
newStr[size] = "";
cout << newStr;

在不复制内存的情况下,您可以创建一个将指针和长度保存为成员的类,并重载流运算符以仅打印length字符:

class MyString
{
   void* _pBuf;
   int _length;
public:
   MyString(void* pBuf, int length)
   {
      _pBuf = pBuf;
      _length = length;
   }
   friend ostream& operator <<(ostream &os,const MyString& obj);
};

ostream& operator <<(ostream &os,const MyString& obj)
{
   const char* pChar = (const char*)obj._pBuf;
   for ( int i = 0 ; i < obj._length ; i++ )
   {
      os << pChar[i];
   }
   return os;
}

用法示例:

   char* x = "blablabla";
   int length = 3;
   MyString str(x,length);
   cout << str;

你可以从指针和长度构造一个 std::string。

std::string sResult(pBytes, nBytes);
std::cout << sResult;

(假设pBytes是一个char*指针,否则你需要一个小的强制转换(。

像这样(未经测试的(代码怎么样:

class my_pointer_string
{
    friend std::ostream &operator<<(std::ostream &, const my_pointer_string &);
public:
    my_pointer_string(void *ptr, size_t len)
        : m_pointer(ptr), m_length(len)
        { }
private:
    void  *m_pointer;
    size_t m_length;
};
std::ostream &operator<<(std::ostream &os, const my_pointer_string &str)
{
    char *string = reinterpret_cast<char *>(str.m_pointer);
    for (size_t i = 0; i < str.m_length; i++)
        os << *string++;
    return os;
}

你需要做的是

a( 创建一些封装字符指针和大小的类。

b( 为该类编写一个<<运算符以将其内容输出到流。

编辑:与Bo Persson的回应相反,这并不意味着复制源数据。