RBuf8 para char * em Symbian C ++
Pergunta
Estou baixando uma cadeia de texto de um serviço web em um RBuf8 usando este tipo de código (funciona ..)
void CMyApp::BodyReceivedL( const TDesC8& data ) {
int newLength = iTextBuffer.Length() + data.Length();
if (iTextBuffer.MaxLength() < newLength)
{
iTextBuffer.ReAllocL(newLength);
}
iTextBuffer.Append(data);
}
Eu quero converter o RBuf8 em um char * corda posso exibir em um rótulo ou o que quer .. ou para fins de depuração, exibição em
RDebug::Printf("downloading text %S", charstring);
Editar para maior clareza ..
minha função de conversão parece com isso ..
vazio CMyApp :: DownloadCompleteL () { { RBuf16 buf; buf.CreateL (iTextBuffer.Length ()); buf.Copy (iTextBuffer);
RDebug::Printf("downloaded text %S", buf);
iTextBuffer.SetLength(0);
iTextBuffer.ReAlloc(0);
}
Mas isso ainda causa um acidente. Eu estou usando S60 3rd Edition FP2 v1.1
Solução
O que você pode precisar é algo no sentido de:
RDebug::Print( _L( "downloaded text %S" ), &buf );
Este tutorial pode ajudá-lo.
Outras dicas
vazio RBuf16 :: Copy (const TDesC8 &) terá um descritor de 8bit e convertê-lo em um descritor de 16bit.
Você deve ser capaz de exibir qualquer descritor 16bit na tela. Se ele não parece trabalho, postar o API específica que você está usando.
Quando uma API pode ser usado com um número indefinido de parâmetros (como RDebug vazio :: Printf (const char *, ...)),% S é usado para "ponteiro para descritor 16bit". Observe a maiúsculas% S.
Graças, o% S é um lembrete útil.
No entanto, isso não parece trabalho .. minha função de conversão parece com isso ..
void CMyApp::DownloadCompleteL() {
{
RBuf16 buf;
buf.CreateL(iTextBuffer.Length());
buf.Copy(iTextBuffer);
RDebug::Printf("downloaded text %S", buf);
iTextBuffer.SetLength(0);
iTextBuffer.ReAlloc(0);
}
Mas isso ainda causa um acidente. Eu estou usando S60 3rd Edition FP2 v1.1
Você tem que fornecer um ponteiro para o descritor em RDebuf :: Printf por isso deve ser
RDebug::Print(_L("downloaded text %S"), &buf);
Embora o uso de _L é desencorajado. _LIT macro é preferido.
Como afirmado por quickrecipesonsymbainosblogspotcom, você precisa passar um ponteiro para o descritor.
RDebug::Printf("downloaded text %S", &buf); //note the address-of operator
Isso funciona porque RBuf8
é derivado de TDes8
(eo mesmo com as versões de 16 bits).