2011-08-16 42 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()