自從接觸到symbian c++的描述符之後才發現在.net中使用string是一件多麼幸福的事情,雖然symbian c++難的不僅僅是描述符,下面對其進行簡單整理讓後來者不至於那麼暈。
一、概念-什麼是描述符?
1、描述符是symbian c++字串的描述類,不同於string,它既可以表示字串,也可以表示二進位制資料;
2、同時支援8位和16位,但是用來儲存字串時並不需要指定哪種型別 ,而是由編譯時的設定決定
#if defined(_unicode)
typedef tptrc16 tptrc
else
typedef tptrc8 tptrc
但當它用來儲存二進位制資料時通常使用8位版本。
二、細說描述符的型別
簡單地說,描述符可以分為五大類,分別是抽象描述符、文字描述符、緩衝區描述符、指標描述符和堆緩衝區描述符。它們的特點和適用場景都各不相同,下面進行一一介紹。
1、抽象描述符
抽象描述符包含tdesc和tdes,tdes是從tdes派生的,因為這些類是抽象的,所以不能例項化,它們多數用於函式引數。tdesc是所有描述符的基類,而tdes與tdesc不同的是tdes可以對資料進行修改,並引入資料最大長度的概念。因為它是所有描述符的基類,因此,後面在描述其他描述符的同時會對它的功能進行介紹。
2、文字描述符
文字描述符是我們用的比較多,它主要用來儲存字串常量,如下:
_lit(khelloworld,"hello world!");
當使用_lit()巨集的時候,產生的其實是乙個tlitc物件(8位或16位),資料實際上被儲存在裝載到ram的二進位制應用程式內,雖然它們實際上並不儲存在rom(或與rom類似的快閃儲存器)中,所以可以把它們看成是唯讀的。
可以使用()操作符將描述符轉換成常量的tdesc物件,比如:
tint length=khelloworld().length()
3、緩衝區描述符
緩衝區描述符tbufc和tbuf將它們的資料儲存為本身的一部分,既然該描述符使用在編譯時就確定的固定數量的記憶體,因此可以在棧上對其進行宣告(作為區域性或者成員變數),這裡看個小例子。
_lit(khelloworld,"hello world");
const tint maxbuf=32;
...tbufcbuf;//空緩衝器,長度為0,從這裡也可以看得出,緩衝描述符一定要宣告乙個長度。
tint currentlen=buf.length();//==0
buf=khelloworld;//在建構函式之後設定內容
currenlen=buf.length();//==11
ttext ch=buf[2]//=="l"
這裡要注意的是tbufc是tdesc的子類,而tbuf是tdes的子類,因此tbuf也提供了修改資料等的多種功能。後面會總結它的修改的方法。
4、指標描述符
指標描述符tptrc和tptr用於引用儲存在別處的、不屬於該描述符所擁有的資料。使用tptr或者tptrc來訪問字串比維護指向零值終止(zero-terminated)字串指標更加安全。下面是乙個小例子:
_lit(khelloworld,"hello world");
tbufcbuf;
buf=khelloworld;//設定內容
tptr ptr=buf.des();//取得指向該緩衝器的指標
ptr[7]='a';//將『0』變成'a'
ptr[8]='l';//將『r』變成'l'
ptr[9]='e';//將'l'變成『e』
ptr[10]='s';//將『d』變成『s』
//現在緩衝器的內容為「hello wales」
5、堆緩衝區描述符
堆描述符hbufc封裝了儲存在堆上的、屬於該描述符所擁有的資料。由於這些資料是動態分配的,因此通過重新分配堆緩衝器,可以在執行時對描述符的最大長度進行設定很改變。
bufc是基於tdesc,並且提供了方法來改變所儲存資料的長度(hbufc::realloc()和hbufc::reallocl()),以及賦值操作來設定資料的內容(受限於最大長度,不能超過最大長度)。可以通過使用hbufc::des()獲取可修改指標描述符來修改描述符的內容,下面是乙個小例子:
_lit(khelloworld,"hello world!");
hbufc *heapbuf=hbufc::newl(kelloworld().length());//宣告乙個長度為khelloworld長的堆描述符
*heapbuf=khelloworld;
delete heapbuf;
三、幾種描述符總結
1、描述符都有的方法:
locate(): 定位指定字元的位置;
compare(): 按位元組比較兩個描述符大小
match(): 搜尋指定描述符的位置,可使用? *等萬用字元
find(): 搜尋指定描述符在當前描述符中第一次出現的位置
left(): 提取描述符最左邊的資料
right(): 提取描述符最右邊的資料
mid(): 提取描述符中間的位置
2、只有tptr和tbuf才有的函式:
lowercase():將描述符轉為小寫字母
uppercase():將描述符轉為大寫字母
insert():在指定位置插入新的描述符
delete():在指定位置刪除指定長度個資料項
3、描述符的典型用法:
1、tbuf/tbufc:棧上的小資料量儲存
2、tptrc:常量字串或資料
3、tptr:指向常量字串或資料,通過des()方法進行資料修改
4、hbufc:大資料量時的處理
mysql 檔案描述符 檔案描述符
toc 首先,linux的世界裡一切皆為檔案,無論是裝置還是乙個socket連線。檔案又可分為 普通檔案 目錄檔案 鏈結檔案和裝置檔案。檔案描述符 file descriptor 是核心為了高效管理已被開啟的檔案所建立的索引,其是乙個非負整數 通常是小整數 用於指代被開啟的檔案,所有執行i o操作的...
linux之檔案描述符
檔案描述符是乙個非負整數。按照慣例,unix系統shell把檔案描述符0與程序的標準輸入關聯,檔案描述符1與標準輸出關聯,檔案描述符2與標準錯誤關聯。當應用程式開啟乙個現有檔案或者建立乙個新檔案時,核心會向程序返回乙個檔案描述符。對於核心而言,所有開啟的檔案都通過檔案描述符引用。上圖基本描繪出了檔案...
檔案描述符
檔案描述符 是個很小的正整數,它是乙個索引值,指向核心為每乙個程序所維護的該程序開啟檔案的記錄表。檔案描述符的優點 相容posix標準,許多 linux 和unix 系統呼叫都依賴於它。檔案描述符的缺點 不能移植到unix以外的系統上去,也不直觀。基於檔案描述符的輸入輸出函式 open 開啟乙個檔案...