C ++ читает несколько байтов по адресу памяти, выводится в виде строки - PullRequest
1 голос
/ 02 февраля 2012

Функция возвращает указатель и длину (через аргументы) из неизвестной библиотеки DLL.

Result = SpamnEggs( &pBytes, &nBytes )

Указатель указывает на действительный адрес памяти, по которому nBytes последовательных байтов. Эти байты содержат допустимые значения ascci для текста. Нет нулевого завершения!

Передо мной стоит задача «переиграть» какой-либо строковый тип за несколько простых операций в общем коде C ++ (без сложных библиотек или использования байтов) перед выводом:

cout << sresult

Добавлено: без копирования байтов, так как это большой буфер, который должен быть пройден.

Прототип:

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

becomes

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

Большое спасибо всем. Отличные ответы и все очень действительные.

Ответы [ 4 ]

2 голосов
/ 02 февраля 2012

Вы можете просто создать std :: string из указателя и длины.

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

(при условии, что pBytes - это указатель char*, в противном случае вам потребуется небольшое приведение).

2 голосов
/ 02 февраля 2012

Вы можете скопировать необработанную память и добавить символ завершения строки самостоятельно:

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 голос
/ 02 февраля 2012

Как на счет этого ( не проверено ) кода:

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;
}
1 голос
/ 02 февраля 2012

Что вам нужно сделать, это

a) Создать некоторый класс, который инкапсулирует указатель на символ и размер.

b) Напишите оператор << для этого класса, чтобы вывести его содержимоев поток. </p>

РЕДАКТИРОВАТЬ: В отличие от ответа Бо Перссона это не будет означать копирование исходных данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...