Symbian 描述符(下)轉(zhuǎn)換_第1頁
Symbian 描述符(下)轉(zhuǎn)換_第2頁
Symbian 描述符(下)轉(zhuǎn)換_第3頁
Symbian 描述符(下)轉(zhuǎn)換_第4頁
全文預(yù)覽已結(jié)束

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、描述符<下>轉(zhuǎn)換業(yè)余有時候把一個事情當作任務(wù)來做的時候,往往會很受限制,就象這篇文檔,上次寫了個上篇,關(guān)于描述符的下篇,自己就遲遲沒有勇氣和時間寫完,好幾次都想靜下心來好好完成它,但是都未能如愿,可如果不寫顯然我也不好意思寫其它的一些東西,閑話提到這里,花了幾天業(yè)余時間總算是完成了,該文質(zhì)量不足之處還望讀者您見諒。通過前面關(guān)于描述符概念和使用的簡單描述,下面我們直接進入描述符轉(zhuǎn)換的主題。雖然描述符有五類,但是作為描述符變量用的,只有三類即棧描述符、堆描述符、指針描述符。所以本文所述描述符的轉(zhuǎn)換也只是在這三種類型間展開,這三類描述符之間的互相轉(zhuǎn)換其實可以用下面這種偽代碼方式給出:TB

2、uf<20> iBuf;TPtriPtr(const_cast<TUint16*>(iBuf.Ptr(),iBuf.Length(), iBuf.Length();HBufC*iHbuf;iBuf = iPtr;iBuf = iHbuf->Des();iPtr.Set(const_cast<TUint16*>(iBuf.Ptr(),iBuf.Length(), iBuf.Length();由上面可知指針型可以起堆型和棧型描述符的中間過渡的橋梁作用。不可修改向可修改描述符的轉(zhuǎn)換原則1:通過不可修改描述符類內(nèi)的Des()函數(shù),將不可修改的描述符轉(zhuǎn)換成可修改

3、的指針描述符示例1:TBufC轉(zhuǎn)換成TPtr_LIT(KText, "Test Data");TBufC<10> NBuf ( KText );TPtr Pointer = NBuf.Des();示例2:HBufC轉(zhuǎn)換成TPtrHBufC * Buf = HBufC:NewL(15);_LIT (KText , "Test Text");*Buf = KText;TPtr Pointer = Buf->Des();原則2:通過TPtr的構(gòu)造函數(shù)或Set()函數(shù)可以將TPtrC描述轉(zhuǎn)換為可修改的指針描述符示例3:TPtrC到TPtrcon

4、st TText * text1 = _S("Hello Worldn");TPtrC Ptr1(text1);TPtrC Ptr2(Ptr1);/可以通過構(gòu)造函數(shù)TPtr Ptr3(TUint16 *)(Ptr1.Ptr(), Ptr1.Length();/也可以通過Set()函數(shù)Ptr3.Set(TUint16 *)(Ptr1.Ptr(),Ptr1.Length(), Ptr1.Length();8位和16位之間的描述符轉(zhuǎn)換8位到16位的描述符轉(zhuǎn)換原則1:通過將兩個8位描述符的內(nèi)容合并為一個16位描述符的方法實現(xiàn)內(nèi)存不動,內(nèi)存塊類型強轉(zhuǎn)(我稱其為保留描述符字節(jié)大小方法)

5、。示例4:8bit To 16bit保留描述符字節(jié)大小方法1_LIT8(KText , "Test Text");TBuf8<20> iBuf8(KText);/描述符實際占用了9個字節(jié)9個8位描述符TBuf<20> iBuf16;/實現(xiàn)內(nèi)存塊的強轉(zhuǎn)TPtrC16 ptr16(reinterpret_cast<const TUint16*>(iBuf8.Ptr(), (iBuf8.Length()/2);/真實的內(nèi)存不動已經(jīng)結(jié)束,這里是重新申請了一塊內(nèi)存并實現(xiàn)內(nèi)存賦值拷貝iBuf16 = ptr16;/描述符實際占用了8個字節(jié)4個16位描

6、述符,導(dǎo)致數(shù)據(jù)丟失由上面的這個例子明顯是丟失了數(shù)據(jù)了,原因就出在設(shè)置長度時用了(iBuf8.Length()/2),為了剔除錯誤,我后來改了一個新的示例6示例6:8bit To 16bit保留描述符字節(jié)大小方法2(由于上例用了TPtrC,所以該例使用TPtr指針,以擴展應(yīng)用)_LIT8(KText , "Test Text");TBuf8<20> iBuf8;iBuf8.FillZ(20);iBuf8 = KText;/實際占用9字節(jié)9描述符TBuf<20> iBuf16;TPtr ptr16(reinterpret_cast<TUint16*

7、>(const_cast<TUint8*>(iBuf8.Ptr(), (iBuf8.Length()+1)/2),(iBuf8.Length()+1)/2);iBuf16 = ptr16;/實際占用10字節(jié)5描述符,但是第10個字節(jié)為0零值,也即9字節(jié)大小有用注:其實這里用堆描述符來說明可能更好些,但是本人在調(diào)試過程中為了能夠看到調(diào)試的效果,所以用了TBuf;而且個人覺得通常這種方法主要在文件讀取等實際過程中用到,如果要轉(zhuǎn)換為16位的話,肯定是偶數(shù)大小的8位描述符。原則2:重新構(gòu)建內(nèi)存塊使用描述符的copy函數(shù)將8位字符的高字節(jié)置為0低字節(jié)不變,進行拷貝轉(zhuǎn)換(我稱其為保留描述

8、符長度方法)。示例7_LIT8(KText , "Test Text");TBuf8<20> iBuf8(KText);/實際占用了9個描述符9個字節(jié)TBuf<20> iBuf16;iBuf16.Copy(iBuf8);/實際占用了9個描述符18個字節(jié)原則3:使用charconv.lib內(nèi)的API函數(shù)將8位的UTF8描述符轉(zhuǎn)換為16位的Unicode 描述符CnvUtfConverter:ConvertToUnicodeFromUtf8(iBuf, iBuf8);注:在使用這種方法時除了包含charconv.lib庫,還應(yīng)該包含utf.h頭文件原則4

9、:使用GBK轉(zhuǎn)Unicode的方法注:原則3和4是我在實際中常用的方法,涉及到各種編碼的問題,暫時不做大的展開,下次使用中文的整理時再展開。16位到8位的描述符轉(zhuǎn)換原則1:通過將一個16位描述符拆分為兩個8位描述符的方法實現(xiàn)內(nèi)存不動,內(nèi)存塊類型強轉(zhuǎn)(我稱其為保留描述符字節(jié)大小方法)示例8_LIT(KText , "Test 文本");TBuf<20> iBuf(KText);/描述符實際占用了14個字節(jié)7個16位描述符/實現(xiàn)內(nèi)存塊的強轉(zhuǎn)TPtrC8 ptr8(reinterpret_cast<const TUint8*>(iBuf.Ptr(), (i

10、Buf.Size();/真實的內(nèi)存不動已經(jīng)結(jié)束,這里是重新申請了一塊內(nèi)存并實現(xiàn)內(nèi)存賦值拷貝TBuf8<20> iBuf8;iBuf8 = ptr8;/描述符實際占用了14個字節(jié)14個8位描述符以上原則2:重新構(gòu)建內(nèi)存塊使用描述符的copy函數(shù)將16位描述符的,進行拷貝轉(zhuǎn)換(我稱其為保留描述符長度方法)。示例9:_LIT(KText , "Test 文本");TBuf<20> iBuf(KText);/ 描述符實際占用了14個字節(jié)7個16位描述符TBuf8<20> iBuf8;iBuf8.Copy(iBuf);/描述符實際占用了7個字節(jié)7個

11、描述符,非ASCII字符值轉(zhuǎn)為1注:該種方法在純ASCII碼的轉(zhuǎn)換時可行,其它數(shù)據(jù)大于255的時候就會丟失數(shù)據(jù)。原則3:使用charconv.lib內(nèi)的API函數(shù)將16位的Unicode描述符轉(zhuǎn)換為8位的UTF8描述符。CnvUtfConverter:ConvertFromUnicodeToUtf8(iBuf8, iBuf);原則4:使用Unicode轉(zhuǎn)GBK的方法同前面理,以后我會再講到。由于最近做通信模塊時組解包用的比較多,為此經(jīng)常會將memcpy,strcpy,sprintf,sscanf等函數(shù)在char字符串和描述符串內(nèi)存塊之間的直接使用,個人覺得描述符一旦取得了后面數(shù)據(jù)區(qū)的首指針,那

12、么內(nèi)存塊的這些操作沒有什么好展開,直接用函數(shù)大家都會,當然本人也推薦讀者使用文后的char字符串和Symbian描述符串的轉(zhuǎn)換方法。在整理過程種,也有其它類型與描述符的轉(zhuǎn)換,我就摘錄在本文后面作為mark和備查:1. TTime轉(zhuǎn)TBuf型TBuf<32> theTime;/存儲轉(zhuǎn)換后的時間TTime tt;tt.HomeTime();_LIT(KTimeFormat,"%Y%M%D%1-%2-%3 %H:%T:%S");/格式為:2006-03-04 12:12:12tt.FormatL(theTime,KTimeFormat);2. TDateTime轉(zhuǎn)TB

13、uf型TTime currentTime;/聲明一個TTime類型currentTime.HomeTime();/設(shè)置TTime為當前時間TDateTime tdt=currentTime.DateTime();/TTime  ->  TdateTimeTBuf<32> tmp;/存儲轉(zhuǎn)換完的Buftmp.AppendNum(tdt.Year();/用AppendNum()方法將一個Tint加入到TBuf中。_LIT(gang,"-");/聲明一個橫線分隔年月日,同樣可聲明冒號分隔小時分秒tmp.Append(gang);tmp.App

14、endNum(tdt.Month();tmp.Append(gang);tmp.AppendNum(tdt.Day();/時分秒的轉(zhuǎn)換同上3. TBuf和Tint互轉(zhuǎn)型/ 15位數(shù)字/ TInt轉(zhuǎn)TBufiBuf.Num(iNum1);/當buf只用來轉(zhuǎn)Tint時可以使用AppendNum,但是性質(zhì)是不一樣的/ 使用iBuf包含的內(nèi)容創(chuàng)建TLex對象TLex iLex(iBuf);TInt iNum2;/TBuf轉(zhuǎn)TInt iLex.Val(iNum2);/ Num2現(xiàn)在包含了15位數(shù)字4. TBuf轉(zhuǎn)TDateTime型將長的TBuf截成小段,分別是年月日時分秒,通過下面TBuf轉(zhuǎn)TInt ,再分別把轉(zhuǎn)換成TInt的年月日取出,通過TDateTime的setYear(),setMonth()等方法將時間set進TdateTime。5. .將symbian串轉(zhuǎn)換成ch

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論