您可以添加到网摘 让更多人关注此文章:
介绍一下TBufC和TBuf的基础知识。 ==================================================================================
example from "epoc32ex\Base\BufsAndStrings\Desc\buffer"
==================================================================================
1. 定义 Build independent non-modifiable buffer descriptor.
This is a descriptor class which provides a buffer of fixed length for containing and accessing TText data.
说明这是一个descriptor类,提供了固定长度的buffer,不可修改,用于访问和使用 TText 类型的数据。
2. 继承关系
根据是否为支持Unicode,TBufC继承自两个不同的类TBufCBase8,TBufCBase16。
TBufC--> TBufCBase16--> TDesC16。或者 TBufC--> TBufCBase8--> TDesC8
class TBufC: public TBufCBase16 { ... protected: TText iBuf[__Align(S)]; };
从类结构定义中可以看出,TBufC保存的是TText 类型的数据。而TText 的定义为:
typedef TText16 TText; 或者 typedef TText8 TText; 而扩展定义为 typedef unsigned char TText8; typedef unsigned short int TText16;可以看出,为了支持Unicode,TText16定义为
16 bits的字符。
从其继承的类结构中(TDesC16,TDesC8)也可以看出TBufC类具有当前数据长度。长度可以通过函数length获得。
但是size()根据不同的编译条件返回不同的字节数目,这一点和TBuf8不同,TBuf8中size()和length()返回的值永远相同。
3. 位置
如果声明为自动变量,则保存在stack上。
4. 使用
因为在TBufC中保存的是TText;类型,在Unicode下,也就是unsigned short int类型的数据,所以可以通过TText数组赋值。TText数组
包含C语言类型的字符串(NULL结尾),也可以放置Unicode码,用于初始化。如下所示:
--------------------------------------------------------------------------------------------------- 初始化和赋值 --------------------------------------------------------------------------------------------------- TText cstr[13] = {0x0042, ''e'' ,''l'' ,''l'' ,''o'', '' '', ''W'', ''o'',''r'', ''l'', ''d'', ''!'', ''\0''};
TText cstr[3] = {0x0042, 0x53e4,0x0000};
// Construct a TBufC using the NULL // terminated string in cstr to initialise it.
TBufC<16> bufc1(&cstr[0]);
/*------------------------另外一种赋值方法----------------------- -----------*/ _LIT(KTxtHelloWorld,"Hello World!");
TBufC<16> bufc2(KTxtHelloWorld); /*------------------------我们不能更改存储的单个部分,但是可以整个替换-----*/ /*-------------------------但是要注意替换的字符长度不能超过目标的长度 ------*/
_LIT(KTxtRepText,"Replacement text");
bufc2 = KTxtRepText;
--------------------------------------------------------------------------------------------------- 取得长度和size ---------------------------------------------------------------------------------------------------
bufc1.Length(); // Length指的是存储的字符数目 bufc1.Size() // size指的是存储的字节数
------------------------------------------------------------------------------------------ 数据段地址 ------------------------------------------------------------------------------------------ bufc1.Ptr() // 可以利用Ptr()函数取得数据段的地址,Ptr()的返回值是 const TUint16 ----------------------------------------------------------------------------------------- Des()函数的使用和利用TPtr访问TBufC ---------------------------------------------------------------------------------------- // 可以利用Des()函数返回一个指向TBufC的TPtr。利用这个TPtr可以访问TBufC TPtr ptr = bufc2.Des(); ptr.Ptr(), // 这个返回的地址和bufc2.Ptr()返回的地址相同 ptr.Length(), ptr.Size() ptr.MaxLength() // 可以取得最大的存储空间长度 // 可以利用Des()函数返回一个指向TBufC的TPtr。利用这个TPtr可以更改 TBufc的内部数据 _LIT(KTxtAndHi," & Hi"); ptr.Delete((ptr.Length()-1),1); // 删除其中的某个位 ptr.Append(KTxtAndHi); // append字符,注意不要超过空间限制 ---------------------------------------------------------------------------------------- 5. 存储方式
TBufC的存储方式如下所示: | head | content |
class TDesC16 { ...... #if defined(__DESC_NO_BIT_FIELDS__) TUint iLength; #else unsigned int iLength:28; unsigned int iType:4; #endif __DECLARE_TEST; }; 其中head包括fixed length 和 type。从类的结构定义可以看出,head占用4个字节,其中长度为28个bit,而type为4个bit。
所以数据只能表示25千万个字符了。并且数据区和整个的descriptor的地址偏移4个字节。
6. TBuf
TBuf的基本属性和TBufC类似,只是TBuf可以允许更改。 ------------------------------------------------------------------------------------------ 初始化和赋值 ------------------------------------------------------------------------------------------
TBuf<16> buf(KTxtHelloWorld);
------------------------------------------------------------------------------------------ 更改数据 ------------------------------------------------------------------------------------------- // The data can be modified buf.Append(''@'');
// Length can be changed; buf.SetLength(3);
// Length can be zeroised; buf.Zero(); // The data can be replaced entirely using the assignment operator. buf = KTxtRepText;
|