接下来,介绍一下TBufC和TBuf的基础知识。
==================================================================================
example from "epoc32exBaseBufsAndStringsDescuffer"
==================================================================================
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'', ''!'', ''''};
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;
(52RD.com)