• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            franksunny的個(gè)人技術(shù)空間
            獲得人生中的成功需要的專(zhuān)注與堅(jiān)持不懈多過(guò)天才與機(jī)會(huì)。 ——C.W. Wendte

             

            描述符Descriptors

            <>概念和使用

             

            接觸Symbian已經(jīng)一個(gè)半月多了,自從上個(gè)月熟悉了框架之后,一直都不敢再寫(xiě)什么東西了,因?yàn)闆](méi)有經(jīng)歷過(guò)代碼怎么可能寫(xiě)得出東西呢?起筆猶豫了很久,打算涉足Symbian與標(biāo)準(zhǔn)C++的一個(gè)不同點(diǎn)——描述符。希望自己能夠借這個(gè)機(jī)會(huì)搞清楚描述符這個(gè)東西。

             

            一、總介

            由于手機(jī)系統(tǒng)的資源區(qū)別于PC,為此為了更好的在內(nèi)存受限設(shè)備上處理內(nèi)存緩沖,Symbian提供了獨(dú)特的描述符,用以存儲(chǔ)和操作字符串、以及管理二進(jìn)制數(shù)據(jù)和其它串行化的復(fù)雜對(duì)象(serialized compound objects)。

            Symbian OS的很多API調(diào)用的參數(shù)都是描述符,同時(shí)Symbian也為描述符提供了很多的操作函數(shù)。但是描述符本身其實(shí)就是一個(gè)封裝了數(shù)據(jù)及其長(zhǎng)度的內(nèi)存塊類(lèi)。作為字符串處理類(lèi),它與標(biāo)準(zhǔn)C++的以'\0'結(jié)束符的字符串有區(qū)別,即它沒(méi)有結(jié)束符;描述符在處理字符串和二進(jìn)制數(shù)據(jù)時(shí)又有不同:首先Symbian使用Unicode,所以字符串通常存于16位描述符中,而二進(jìn)制數(shù)據(jù)存儲(chǔ)于8位描述符中(通常在底層通信中用的都是8位的描述符);其次如果描述符中包括二進(jìn)制數(shù)據(jù),則描述符的字符串操作方法不可用(我的理解是可以用,但是不能當(dāng)字符串來(lái)用,所以也就沒(méi)有意義了。至于處理串行化對(duì)象,本人沒(méi)有接觸所以暫時(shí)略過(guò))。

             

            二、描述符類(lèi)型分類(lèi)及其相互關(guān)系

            描述符主要有四類(lèi),但是我們通常將文字常量也作為描述符的一類(lèi),所以就有了五類(lèi),以下就是常見(jiàn)分類(lèi):

            ·       抽象類(lèi)(Abstract):(TDesTDesCTdes8TdesC8),其他描述符的基類(lèi),僅提供接口和基本功能,不能被實(shí)例化,一般只用作函數(shù)的參數(shù)。

            ·       文字常量(Literal):(TlitC_LIT()),用于存儲(chǔ)文字字符串(literal string),即C中字符串常量,通常使用_LIT()這種方式(當(dāng)然還有_L()_L8()的描述方式,但都不提倡用)。

            ·       棧類(lèi)(Buffer):(TbufTbufCTbuf8TbufC8),數(shù)據(jù)存儲(chǔ)于棧上,最基本的描述符變量類(lèi)型,大小在編譯時(shí)確定,包含描述符本身數(shù)據(jù),使用最為普遍。

            ·       堆類(lèi)(Heap):(HbufCHbufC8),數(shù)據(jù)存儲(chǔ)于堆上,大小在運(yùn)行時(shí)確定,也就是是用來(lái)處理動(dòng)態(tài)申請(qǐng)的描述符類(lèi)。在C/C++中用過(guò)動(dòng)態(tài)內(nèi)存的都知道,動(dòng)態(tài)內(nèi)存是啥回事,這里堆類(lèi)描述符用的時(shí)候,也是差不多,由于堆描述符沒(méi)有構(gòu)造函數(shù),所以只能聲明為指針類(lèi)型,通過(guò)堆描述符類(lèi)內(nèi)靜態(tài)函數(shù)NewL方法申請(qǐng)內(nèi)存,具體方法如下

            HBufC* errorTitleCode = HBufC::NewLC(50);

            HbufC* unUseCode = NULL;

            ·       指針類(lèi)(Pointer):(TPtrTPtrCTPtr8TPtrC8),本身不包含描述符數(shù)據(jù),但是包含長(zhǎng)度數(shù)據(jù),而且還包含一個(gè)指向位于描述符之外數(shù)據(jù)的指針。

            從以上分類(lèi)可知,描述符有8位和16位寬度的區(qū)別,還有可修改和不可修改的區(qū)別,具體的區(qū)別我從內(nèi)存的角度出發(fā)列表如下:

            具體類(lèi)型

            類(lèi)型(4b

            當(dāng)前長(zhǎng)度(28b

            最大長(zhǎng)度(32b

            Buffer

            TDesC8

             

            Yes

            無(wú)

            無(wú)

            TDesC

             

            Yes

            無(wú)

            無(wú)

            TDes8

             

            Yes

            Yes

            無(wú)

            TDes

             

            Yes

            Yes

            無(wú)

            TBufC8

            0

            Yes

            無(wú)

            ByteBuffer

            TBufC

            0

            Yes

            無(wú)

            WordBuffer

            TBuf8

            3

            Yes

            Yes

            ByteBuffer

            TBuf

            3

            Yes

            Yes

            WordBuffer

            TPtrC8

            1

            Yes

            無(wú)

            32位指針

            TPtrC

            1

            Yes

            無(wú)

            32位指針

            TPtr8

            2

            Yes

            Yes

            32位指針

            TPtr

            2

            Yes

            Yes

            32位指針

            HBufC8

            0

            Yes

            無(wú)

            ByteBuffer

            HBufC

            0

            Yes

            無(wú)

            WordBuffer

            注:

            1、  表中空出的內(nèi)容,我暫時(shí)還不知道具體的值是多少。其中的bbit的意思;

            2、  在實(shí)際操作中,定義的描述符長(zhǎng)度和內(nèi)存實(shí)際使用長(zhǎng)度會(huì)有不一致問(wèn)題,原因是描述符也是按4字節(jié)進(jìn)行邊界對(duì)齊的

            由如表所示的內(nèi)存關(guān)系可能顯得有點(diǎn)亂,如果能將每個(gè)類(lèi)用UML類(lèi)圖(包括詳盡的成員變量和成員函數(shù),類(lèi)的頭文件在e32des16.he32des8.h中)來(lái)表示就更直觀了,在Symbian官方網(wǎng)站有一張類(lèi)簡(jiǎn)圖,我先將此作為繼承關(guān)系的簡(jiǎn)圖在這里作為演示用

             

            三、描述符的使用

            介紹到這里應(yīng)該具體講每一個(gè)描述類(lèi)的使用了,我發(fā)現(xiàn)有兩篇中文文檔整理的很好,在這里,我只做一些驗(yàn)證性的介紹,讀者可以參閱我在文章后列出的兩篇文檔。由于要略過(guò)不能實(shí)例化的抽象類(lèi),且按照從簡(jiǎn)單到復(fù)雜的過(guò)程來(lái)敘述:

             

            1、  文字描述符常量

            a_LIT()可以生成個(gè)常量名,以便以后重復(fù)使用,例如

            _LIT(KMyFile, "c:\System\Apps\MyApp\MyFile.jpg");

            _LIT()宏的結(jié)果(就是上面的KMyFile)實(shí)際上是個(gè)文字描述符(literal descriptorTLitC,它可以在任何使用TDesC&的地方使用。(但是TlitC已經(jīng)不推薦使用了)。

            b_L()可以生成一個(gè)指向字符值的地址(TPtrC),它經(jīng)常被用來(lái)傳遞字符串到函數(shù)中(包括描述符的構(gòu)造函數(shù)和格式化函數(shù));同理_L8()則可以生成一個(gè)指向二進(jìn)制數(shù)據(jù)的地址(TPtrC8)舉例如下:

            //常用的通知函數(shù)

            NEikonEnvironment::MessageBox(_L("Error: init file not found!"));

            //數(shù)字轉(zhuǎn)字符串

            TBuf16<20> buf;//

            TInt iNum = 20;

            buf.Format( _L( "%d" ) , iNum  );

             

            2、  棧描述符

            棧類(lèi)描述符聲明時(shí)必須指定描述符的最大長(zhǎng)度,否則無(wú)法聲明和定義,下面舉例

            1:構(gòu)造

            // 直接從字符串中構(gòu)造

            _LIT(Ktext, "TestText");

            TBufC<10> Buf (Ktext);

            // 或從字符串賦值

            TBufC<10> Buf2;

            Buf2 = Ktext;

            // 從已有的對(duì)象中生成新的TBufC

            TBufC<10> Buf3(Buf2);

            TBufC<n>一般用來(lái)存儲(chǔ)文本數(shù)據(jù),而TBufC8<n>則用來(lái)存儲(chǔ)二進(jìn)制數(shù)據(jù)。盡管這里的對(duì)象表示數(shù)據(jù)是不能被修改的(因?yàn)橛袀€(gè)后綴C代表了常量的意思),但仍然有兩種方式可以用來(lái)修改數(shù)據(jù)內(nèi)容:這里的數(shù)據(jù)可以用賦值的方式替換掉;使用Des()函數(shù)構(gòu)造出一個(gè)TPtr對(duì)象,這樣就可以用它來(lái)修改數(shù)據(jù)。

            2:修改數(shù)據(jù)

            _LIT(Ktext , "Test Text");        

            _LIT(Ktext1 , "Test1 Text");

            _LIT(KXtraText , "New:");

            _LIT(NewText , "New1");

            _LIT(NewText1 , "New2");

            TBufC<10> Buf1 ( Ktext );//Buf1長(zhǎng)度為9 內(nèi)容 Test Text

            TBufC<10> Buf2 ( Ktext1 );//Buf2長(zhǎng)度為10 內(nèi)容 Test1 Text

             

            // 通過(guò)賦值的方式改變數(shù)據(jù)

            Buf2 = Buf1; //Buf2長(zhǎng)度變?yōu)?/span>9 內(nèi)容 Test Text

             

            //通過(guò)使用Des()生成指針改變TBufC的數(shù)據(jù)

            TPtr Pointer = Buf1.Des();

            // 刪除后四個(gè)字符

            Pointer.Delete(Pointer.Length()-4, 4 ); //Buf1長(zhǎng)度變?yōu)?/span>5 內(nèi)容“Test

                                           //但是內(nèi)存應(yīng)該沒(méi)變

            // 增加新的數(shù)據(jù)

            Pointer.Append(KXtraText);//Buf1長(zhǎng)度為9 內(nèi)容為“Test New:”

             

            // 也可以使用下列方式改變數(shù)據(jù)      

            TBufC<10> Buf3(NewText);

            Pointer.Copy(Buf3);//Buf1長(zhǎng)度為4,內(nèi)容為New1

            // 或直接從字符串里獲得數(shù)據(jù)

            Pointer.Copy(NewText1);//Buf1長(zhǎng)度為4,內(nèi)容為New2

             

            以上介紹的是不可修改的棧描述符,而可修改的描述符就不用通過(guò)那么復(fù)雜的方法來(lái)實(shí)現(xiàn)修改,它直接可以用CopyDelete等方法,但是無(wú)論可修改的還是不可修改的,一旦指定最大的數(shù)據(jù)長(zhǎng)度后,最大長(zhǎng)度就不能進(jìn)行修改了。修改的只是數(shù)據(jù)內(nèi)容,而數(shù)據(jù)內(nèi)容修改的受限條件是不能超過(guò)聲明或定義時(shí)的最大長(zhǎng)度。(個(gè)人以為從內(nèi)存角度來(lái)說(shuō),不可修改類(lèi)型的缺少最大長(zhǎng)度,所以嚴(yán)格上來(lái)說(shuō)為了減少錯(cuò)誤,修改數(shù)據(jù)內(nèi)容是不允許的)

             

            3、  堆描述符

            堆描述符雖然都是不可修改類(lèi)型的,但是它仍然具有構(gòu)造和修改,與棧描述符不同的是:首先對(duì)內(nèi)存需要顯示釋放,其次是堆描述符沒(méi)有最大長(zhǎng)度的限制,任何時(shí)候都可以用ReAlloc()函數(shù)重新申請(qǐng)分配。具體見(jiàn)示例:

                   //1、構(gòu)造

                   //有兩種方式來(lái)生成一個(gè)Heap Descriptor

                   //第一種方式用New(),NewL(),NewLC()

                   //如下操作便可以構(gòu)建一個(gè)存放數(shù)據(jù)的空間,空間為15,不過(guò)目前大小為0

                   HBufC * Buf = HBufC::NewL(15);

                  

                   //第二種方式是采用Alloc()AllocL()AllcLC()來(lái)處理,

                   //不過(guò)這是已經(jīng)存在的數(shù)據(jù)的管理方式。新的Heap Descriptor

                   //可以自動(dòng)的根據(jù)這個(gè)內(nèi)容來(lái)構(gòu)造。

                   _LIT (KText , "Test Text");

                   TBufC<10>  CBuf = KText;

                   HBufC * Buf1 = CBuf.AllocL();

                   CleanupStack::PushL(Buf1);

                  

                   //2、修改

                   //下面是通過(guò)賦值方式改變其數(shù)據(jù)的方法

                   _LIT ( KText1 , "Text1");

                   *Buf1 = KText1;

                  

                   // 通過(guò)可修改指針來(lái)改變數(shù)據(jù)的方式

                   TPtr Pointer = Buf1->Des();

                   //添加數(shù)據(jù)

                   Pointer.Delete(Pointer.Length() - 2, 2);

                   //刪除數(shù)據(jù)

                   _LIT ( KNew, "New:");

                   Pointer.Append(KNew);

             

                   //3、重新申請(qǐng)內(nèi)存

                   Buf1 = Buf1->ReAllocL(KText().Length() + KNew().Length());

                   CleanupStack::PushL(Buf1);

             

                   //4、釋放內(nèi)存

                   //直接用delete

                   delete Buf;

                   Buf = NULL;

                   //如果在使用NewLReAllocL等異常函數(shù)后我們使用清除棧壓入的話

                   //那么我們也可以用清除棧來(lái)釋放內(nèi)存

                   CleanupStack::PopAndDestroy();

                   Buf1 = NULL;

             

            注:關(guān)于以上用清除棧的方式,個(gè)人只是猜測(cè),因?yàn)閷?duì)Symbian的異常處理三部曲,至今仍沒(méi)有很好的掌握,所以如果有什么誤用還望指點(diǎn)。

             

            4、  指針描述符

            其實(shí)關(guān)于指針描述符,我們?cè)谏厦嬉呀?jīng)用過(guò)可修改的指針TPtr了,下面返璞歸真,從TPtrC的構(gòu)造開(kāi)始介紹使用

                   //1TBufTBufC構(gòu)造出TPtrC對(duì)象

                   _LIT(KText , "Test Code");

                   TBufC<10> Buf ( KText );

                   //或者為 TBuf<10> Buf ( KText );

                   // Creation of TPtrC using Constructor

                   TPtrC     Ptr (Buf);

                   // Creation of TPtrC using Member Function

                   TPtrC     Ptr1;

                   Ptr1.Set(Buf);

             

                   //2TText*構(gòu)造TPtrC

                   const TText* text = _S("Hello World\n");

                   TPtrC ptr(text);

                   // 或者

                   TPtrC Ptr2;

                   Ptr2.Set(text);

                   //如果要存儲(chǔ)TText的一部分?jǐn)?shù)據(jù),我們使用下列方法

                   TPtrC   ptr4(text, 5);

                  

                   //3從另一個(gè)TPtrC中構(gòu)造TPtrC

                   const TText * text1 = _S("Hello World\n");

                   TPtrC Ptr3(text1);

                   // 從一個(gè)TPtrC中獲得另一個(gè)TPtrC

                   TPtrC p1(Ptr3);

                   //

                   TPtrC p2;

                   p2.Set(Ptr3);

            以上是不可修改的TPtrC的構(gòu)造,相對(duì)應(yīng)的也有可修改的TPtr的構(gòu)造,不過(guò)我們下面省略了用Set()函數(shù)的構(gòu)造方法

                   //1通過(guò)TBufC,HBufCDes()方法獲取

                   _LIT(KText, "Test Data");

                   TBufC<10> NBuf ( KText );

                   TPtr     Pointer = NBuf.Des();

             

                   //2通過(guò)指定內(nèi)存區(qū)域和大小來(lái)生成

                   const TText * Text = _S("Test Second");

                   TPtr    Pointer1((TText*)Text, 11, 12);

             

                   //3 通過(guò)另一個(gè)TPtr對(duì)象來(lái)生成

                   TPtr     Pointer2 ( Pointer );

            對(duì)于可修改的TPtr雖然前面用過(guò),但是我們?cè)谶@里在簡(jiǎn)單的添加兩個(gè)例子加深下印象,并且說(shuō)明指針修改的始終是它指向的描述符:

                   //1改變已有TPtr數(shù)據(jù)的方式:賦值和Copy()方法  

                   _LIT(KText, "Test Data");

                   _LIT(K1, "Text1");

                   _LIT(K2, "Text2");

                   TBufC<10> NBuf ( KText );//NBuf內(nèi)容為“Test Data

                   TPtr     Pointer = NBuf.Des(); //Pointer指向NBuf的內(nèi)容       

                   Pointer = K1; // NBuf內(nèi)容為“Text1

                   Pointer.Copy(K2); // NBuf內(nèi)容為“Text2

                  

                   //2、直接通過(guò)修改長(zhǎng)度改變數(shù)據(jù)內(nèi)容

                   Pointer.SetLength(2); // NBuf內(nèi)容為"Te" 注:實(shí)際內(nèi)存的內(nèi)容應(yīng)該沒(méi)變

             

            5、  抽象描述符

            抽象描述符,沒(méi)有什么好說(shuō)的,正如前面所說(shuō),只用在函數(shù)的形參中,通常要強(qiáng)調(diào)參數(shù)是不可修改的,就用const TDesC&表示,可修改的參數(shù)用TDesC&表示。

             

            四、常用API函數(shù)羅列

            下面再對(duì)描述符的幾個(gè)常用修改和不可修改API函數(shù)加以羅列

            不可修改型:

            //獲取屬性類(lèi)

            Length()Size()

            //查找、比較類(lèi)

            Compare()Locate()LocateReverse ()Find()Match()

            //取描述符子串指針類(lèi)

            Left()Right()Mid()

            可修改型:

            //增加、插入、刪除類(lèi)

            Insert()Delete()Append()Replace() Trim()

            //賦值類(lèi)

            Zero()Copy()Num()Format()

             

            本文涉及的兩篇文檔

            Nokia官方培訓(xùn)(Symbian4300)筆記()—Descriptors(該文鏈接google里面找)

            中文 Descriptors的使用

            http://wiki.forum.nokia.com/index.php/%E4%B8%AD%E6%96%87_Descriptors%E7%9A%84%E4%BD%BF%E7%94%A8#TPtr.E7.9A.84.E4.BD.BF.E7.94.A8

            后記:本想把涉及描述符的轉(zhuǎn)換也整理在一篇文章中的,但是后來(lái)發(fā)現(xiàn)整理完概念和使用已經(jīng)消耗了我一天多時(shí)間了,晚上部門(mén)要去喝茶,為此暫時(shí)到這里,明天周末在整理轉(zhuǎn)換問(wèn)題。由衷感謝單位給我那么多時(shí)間在工作中學(xué)習(xí),想想以前第一份工作時(shí),在單位看書(shū)都要被老板說(shuō)的歷史,發(fā)覺(jué)自己現(xiàn)在真的蠻幸運(yùn)的。

             本文由于圖片不能顯示同樣給出word版本地址http://m.shnenglu.com/Files/franksunny/描述符Descriptors(上).rar

            posted on 2007-10-19 17:23 frank.sunny 閱讀(3627) 評(píng)論(6)  編輯 收藏 引用 所屬分類(lèi): symbian 開(kāi)發(fā)

            FeedBack:
            # re: 描述符Descriptors概念和使用
            2007-10-19 17:58 | Minidx全文檢索
            不錯(cuò)不錯(cuò)
            沒(méi)接觸過(guò)Symbian,這個(gè)下面支持STL之類(lèi)的庫(kù)編譯的東西嗎?對(duì)執(zhí)行文件有什么要求?  回復(fù)  更多評(píng)論
              
            # re: 描述符Descriptors概念和使用
            2007-10-21 09:36 | frank.sunny
            @Minidx全文檢索


            謝謝您來(lái)哦,不好意思的很,昨天一天都沒(méi)上來(lái)過(guò),所以本來(lái)想寫(xiě)的二也沒(méi)有完成,今天早上起來(lái)看到你的回復(fù)。簡(jiǎn)單的說(shuō)Symbian是不支持STL的,但是它有自己的與容器相關(guān)的類(lèi)。

            至于執(zhí)行文件的要求,我不知道你指的是什么?


              回復(fù)  更多評(píng)論
              
            # re: 描述符Descriptors概念和使用
            2007-10-21 09:42 | Minidx全文檢索
            不好意思我的問(wèn)題比較"白癡"^^
            就是想知道編譯后的文件也是exe類(lèi)型的?Symbian支持哪些文件格式?  回復(fù)  更多評(píng)論
              
            # re: 描述符Descriptors概念和使用
            2007-10-21 10:19 | frank.sunny
            @Minidx全文檢索

            呵呵,編譯后一般都是APP的,但是也有exe的控制臺(tái)程序,手機(jī)Symbian OS都是以dll的方式調(diào)用。不過(guò)慚愧至今還沒(méi)有試過(guò)將exe的控制臺(tái)程序,移到手機(jī)上去試過(guò)。
            不管怎么樣要移到手機(jī)上,得要打包成sis才可以。
            這個(gè)問(wèn)題是關(guān)于symbian的文件問(wèn)題,如果你感興趣,可以看看我前面有篇Symbian資源文件解析,文后涉足了下各類(lèi)Symbian文件

            不過(guò)這里討論描述符,別讓我跑題了哦,呵呵
            謝謝參與
            總得來(lái)說(shuō)可能現(xiàn)在這里搞Symbian的人還是不多啊  回復(fù)  更多評(píng)論
              
            # re: 描述符Descriptors概念和使用
            2007-10-21 10:31 | Minidx全文檢索
            謝謝~受教了~
            以前自己寫(xiě)過(guò)手機(jī)上的Java游戲,平臺(tái)不同,區(qū)別還是挺大的。  回復(fù)  更多評(píng)論
              
            # re: 描述符Descriptors概念和使用
            2009-07-04 00:21 | rongl
            好東東,嘿嘿~~  回復(fù)  更多評(píng)論
              

            常用鏈接

            留言簿(13)

            隨筆分類(lèi)

            個(gè)人其它博客

            基礎(chǔ)知識(shí)鏈接

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            亚洲精品成人网久久久久久| 伊人久久免费视频| 亚洲精品国产综合久久一线| 色婷婷久久综合中文久久一本| 嫩草影院久久99| 久久久青草青青亚洲国产免观| 日批日出水久久亚洲精品tv| 无码国内精品久久人妻蜜桃| 久久久久se色偷偷亚洲精品av | 国产精品gz久久久| 久久国产精品99国产精| 香蕉久久夜色精品升级完成| 中文国产成人精品久久不卡| 久久这里只有精品久久| 美女久久久久久| 色综合久久久久无码专区| 香蕉99久久国产综合精品宅男自| 亚洲天堂久久久| 热久久最新网站获取| 久久91这里精品国产2020| 国产福利电影一区二区三区久久老子无码午夜伦不 | 久久久这里有精品中文字幕| 久久精品中文字幕一区| 人妻少妇久久中文字幕| 久久久久18| 国产精品美女久久久免费| 久久99精品九九九久久婷婷| 久久99热这里只有精品66| 性高湖久久久久久久久| 久久丫精品国产亚洲av不卡 | 久久婷婷五月综合色高清| 久久久久久毛片免费播放| 97久久精品人妻人人搡人人玩| av色综合久久天堂av色综合在| 亚洲αv久久久噜噜噜噜噜| 久久精品国产亚洲AV无码娇色| 久久99国产精品尤物| 伊人热人久久中文字幕| 午夜精品久久久内射近拍高清 | 久久综合视频网站| 久久久精品国产免大香伊 |