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
Решение
Вам может понадобиться что-то вроде:
RDebug::Print( _L( "downloaded text %S" ), &buf );
Это руководство может вам помочь.
Другие советы
void RBuf16 :: Copy (const TDesC8 & amp;) возьмет 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
Вы должны указать указатель на дескриптор в RDebuf :: Printf, поэтому он должен быть
RDebug::Print(_L("downloaded text %S"), &buf);
Хотя использование _L не рекомендуется. Макрос _LIT является предпочтительным. Р>
Как заявляет quickrecipesonsymbainosblogspotcom, вам нужно передать указатель на дескриптор.
RDebug :: Printf (" загруженный текст% S " ;, & amp; buf); // обратите внимание на адрес оператора
Это работает, потому что RBuf8
является производным от TDes8
(и то же самое с 16-битными версиями).