2011-08-16 43 views
0

我试着用下面的代码转换:如何TBuf8转换为QString的

template< unsigned int size > 
static QString 
TBuf82QString(const TBuf8<size> &buf) 
{ 
    return QString::fromUtf16(
     reinterpret_cast<unsigned short*>(
     const_cast<TUint8*>(
      buf.Ptr())), buf.Length()); 
} 

但它总是返回类似?????b

编辑:改变的代码示例

+0

是否上述工作的代码,如果QT_NO_UNICODE定义? – James

+0

它似乎甚至没有编译。 – Gerstmann

+0

TBuf8中存储了什么?在那里真正的字节顺序是否真的有UTF16字符?它是否以2个零字节结束? – hmuelner

回答

1

使用模板可能不是一个很好的解决方案,因为它会导致你的应用程序二进制文件中的代码块的一个新的实例,对于输入字符串的每一个尺寸为转换。由于输出类型(QString)不包含编译时常量,这意味着最终会出现代码膨胀,无法获得增益。

一个更好的方法是利用从TDesC8TBuf8<N>继承的事实:

QString TBuf2QString(const TDesC8 &buf) 
{ 
    return QString::fromLocal8Bit(reinterpret_cast<const char *>(buf.Ptr()), 
            buf.Length()); 
} 

TBuf<16> foo(_L("sometext")); 
QString bar = TBuf2QString(foo); 
+0

这仍输出垃圾。我试图转换由CConnMonWlanNetwork :: WlanBssid()给出的WLAN BSSID:TBuf8 。不过,关于模板的好点。 – Gerstmann

+0

你可以添加更多的代码吗?也许你试图错误地显示它? – James

+0

正如詹姆斯所说的,一个8位描述符应该使用'RDebug :: RawPrint'打印,而不是'RDebug :: Printf' –

1

TBuf8用于二进制数据或非Unicode字符串。 TBuf16用于Unicode字符串。 TBuf是有条件编译的,并且始终是TBuf16,因为Symbian OS本身就是Unicode。

尝试使用QString::fromLocal8Bit()TBuf8::Ptr()