RBuf8 в char * в Symbian C++

Я загружаю текстовую строку из веб-службы в RBuf8, используя такой код (он работает ..)

void CMyApp::BodyReceivedL( const TDesC8& data ) {
    int newLength = iTextBuffer.Length() + data.Length();
    if (iTextBuffer.MaxLength() < newLength)
        {
            iTextBuffer.ReAllocL(newLength);
        }
    iTextBuffer.Append(data);
}

Затем я хочу преобразовать RBuf8 в строку char *, которую я могу отображать в метке или что-то еще ... или для целей отладки отображать в

RDebug::Printf("downloading text %S", charstring);

редактировать для ясности ..

Моя функция преобразования выглядит так ...

void CMyApp :: DownloadCompleteL () { { RBuf16 buf; buf.CreateL (iTextBuffer.Length ()); buf.Copy (iTextBuffer);

    RDebug::Printf("downloaded text %S", buf);
    iTextBuffer.SetLength(0);
    iTextBuffer.ReAlloc(0);                                 
}

Но это все равно вызывает сбой. Я использую S60 3rd Edition FP2 v1.1

В чем разница между методом "==" и equals()
В чем разница между методом "==" и equals()
Это один из наиболее часто задаваемых вопросов новичкам на собеседовании. Давайте обсудим его на примере.
Замена символа по определенному индексу в JavaScript
Замена символа по определенному индексу в JavaScript
В JavaScript существует несколько способов заменить символ в строке по определенному индексу.
0
0
1 103
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

void RBuf16 :: Copy (const TDesC8 &) примет 8-битный дескриптор и преобразует его в 16-битный дескриптор.

Вы должны иметь возможность отображать на экране любой 16-битный дескриптор. Если это не работает, опубликуйте конкретный API, который вы используете.

Когда API может использоваться с неопределенным количеством параметров (например, void RDebug :: Printf (const char *, ...)),% S используется для «указателя на 16-битный дескриптор». Обратите внимание на верхний регистр% S.

Спасибо,% S - полезное напоминание.

Однако, похоже, это не работает ... моя функция преобразования выглядит так ...

void CMyApp::DownloadCompleteL() {
    {
        RBuf16 buf;
        buf.CreateL(iTextBuffer.Length());
        buf.Copy(iTextBuffer);

        RDebug::Printf("downloaded text %S", buf);
        iTextBuffer.SetLength(0);
        iTextBuffer.ReAlloc(0);                 
    }

Но это все равно вызывает сбой. Я использую S60 3rd Edition FP2 v1.1

Как указано в quickrecipesonsymbainosblogspotcom, вам необходимо передать указатель на дескриптор.

RDebug::Printf("downloaded text %S", &buf); //note the address-of operator

Это работает, потому что RBuf8 является производным от TDes8 (и то же самое с 16-битными версиями).

это отображает только первую букву RBuf16

adam 01.12.2008 20:01

Вы, наверное, правы, потому что я пропустил _L ("") в строке, который заметил Аяз.

Mark Cheeseborough 01.12.2008 23:15
Ответ принят как подходящий

Вам может понадобиться что-то вроде:

RDebug::Print( _L( "downloaded text %S" ), &buf );

Этот учебник может вам помочь.

Вы должны указать указатель на дескриптор в RDebuf :: Printf, поэтому он должен быть

RDebug::Print(_L("downloaded text %S"), &buf);

Хотя использование _L не рекомендуется. Макрос _LIT является предпочтительным.

Другие вопросы по теме