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

时间:2012-02-02 07:59:59

标签: c++ arrays string function pointers

函数返回指针和来自未知DLL的长度(通过参数)。

Result = SpamnEggs( &pBytes, &nBytes )

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

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

cout << sresult

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

原型:

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

becomes

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

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

4 个答案:

答案 0 :(得分:2)

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

char* newStr = new char[size + 1];
memcpy ( newStr, source, size );
newStr[size] = "\0";
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;

答案 1 :(得分:2)

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

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

(假设pByteschar*指针,否则你需要一个小演员。)

答案 2 :(得分:1)

你需要做的是

a)创建一个封装char指针和大小的类。

b)写一个&lt;&lt;该类的运算符,用于将其内容输出到流中。

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

答案 3 :(得分:1)

这样的事情(未经测试的)如何:

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;
}