TBuf和const char*的转换

TBuf和const char*的转换

http://wiki.forum.nokia.com/index.php/How_to_Convert_TBuf_to_Char_and_Vice_Versa

How to Convert TBuf to Char and Vice Versa
From Forum Nokia Wiki

void stringToDescriptor(const char* aString, TDes& aDescriptor)
{
    TPtrC8 ptr(reinterpret_cast<const TUint8*>(aString));
    aDescriptor.Copy(ptr);
}

Usage:

const char* str = "Hello, world!";
    TBuf<32> buffer;  // Make it large enough for str
    stringToDescriptor(str, buffer);

Problem with the code above is that defining a TBuf not large enough will raise a USER 23 panic.

Some ways to avoid this include:

Using either __ASSERT_DEBUG or __ASSERT_ALWAYS, depending on your needs. Note that you can use alternatives to User::Panic(), as long as you avoid executing sensitive code.

void stringToDescriptor(const char* aString, TDes& aDescriptor)
{
    TPtrC8 ptr(reinterpret_cast<const TUint8*>(aString));
    _LIT(KMyPanicDescriptor, "My panic text");
    __ASSERT_ALWAYS(User::StringLength(reinterpret_cast<const TUint8*>(aString))
 <= aDescriptor.MaxLength(), User::Panic(KMyPanicDescriptor, 0));
    aDescriptor.Copy(ptr);
}

The other way is relying on a dynamic buffer, using HBufC for instance:

HBufC* stringToDescriptorL(const char* aString)
{
    TPtrC8 ptr(reinterpret_cast<const TUint8*>(aString));
    HBufC* buffer = HBufC::NewL(ptr.Length());
    buffer->Des().Copy(ptr);
 
    return buffer;
}

Note that the caller is responsible of freeing the HBufC returned. Also note the trailing "L" in the function's name.

Depending on your code, you may prefere one of these over the others. Also, you may need to add extra checks (for instance, checking whether the char pointer is null or not).

Converting descriptors to C-strings may be done this way:

const char* descriptorToStringL(const TDesC& aDescriptor)
{
    TInt length = aDescriptor.Length();
 
    HBufC8* buffer = HBufC8::NewLC(length);
    buffer->Des().Copy(aDescriptor);
 
    char* str = new(ELeave) char[length + 1];
    Mem::Copy(str, buffer->Ptr(), length);
    str[length] = '/0';
 
    CleanupStack::PopAndDestroy(buffer);
 
    return str;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值