近来在家中休息,想整理一下自己的笔记,还是从基本的开始吧
缓冲区描述符
TBufC //e32cmn.h
基本用法
_LIT (KText1, "Hello World/n" );
TBufC <30> bufText1;
bufText1 = KText1; // 这个“ = ”已经被重载过了
console-> Write (bufText1);
_LIT (KText2, "Hello World/n" );
TBufC <30> bufText2(KText2);
console-> Write (bufText2);
类函数
template < TInt S >
#if defined(_UNICODE) && !defined(__KERNEL_MODE__)
class TBufC : public TBufCBase16
#else
class TBufC : public TBufCBase8
#endif
{
public :
inline TBufC ();
inline TBufC ( const TText * aString);
inline TBufC ( const TDesC & aDes);
inline TBufC < S >& operator= ( const TText * aString); // 这个“ = ”已经被重载过了
inline TBufC < S >& operator= ( const TDesC & aDes); // 这个“ = ”已经被重载过了
inline TPtr Des ();
private :
TText iBuf [ __Align ( S )];
};
// 拷贝构造函数和默认的重载操作符
TBufC ( const TBufC <S>& buf);
TBufC < S >& operator = ( const TBufC <S>& aBuf);
TBuf //e32cmn.h
基本用法
_LIT (KText, "YunYun/n" );
TBuf <100> buf;
buf. Copy (KText);
console-> Write (buf);
TBufC <30> bufText(KText);
buf. Copy (bufText);
console-> Write (buf);
buf. Zero ();
buf. AppendFormat ( _L ( "this is a TBuf example,%S" ),&KText);
buf. AppendFormat ( _L ( "++_ %S" ),&bufText);
console-> Write (buf);
// 也可以用 = ,但是那样多了一个 32 位的最大长度 iMaxLength ,不好
使用方法基本跟 TBufC 相同,在栈上分配空间,直接声明使用
修改方法都是从 TDes 中继承的
类函数
template < TInt S >
#if defined(_UNICODE) && !defined(__KERNEL_MODE__)
class TBuf : public TBufBase16
#else
class TBuf : public TBufBase8
#endif
{
public :
inline TBuf ();
inline explicit TBuf ( TInt aLength); //explicit 不能被隐式转换
inline TBuf ( const TText * aString);
inline TBuf ( const TDesC & aDes);
inline TBuf < S >& operator= ( const TText * aString);
inline TBuf < S >& operator= ( const TDesC & aDes);
inline TBuf < S >& operator= ( const TBuf < S >& aBuf);
private :
TText iBuf [ __Align ( S )];
};
指针描述符
TPtrC //e32des16.h
//iPtr 存放指向 buffer 的指针
基本用法
_LIT (KText, "YunYun/n" );
TBuf <100> buf;
buf. Copy (KText);
TPtrC ptrc1 = buf. Left (3);
TPtrC ptrc2(ptrc1);
TPtrC ptrc3;
ptrc3. Set (buf);
console-> Write (ptrc1);
console-> Write (ptrc2);
console-> Write (ptrc3);
类函数
class TPtrC16 : public TDesC16
{
public :
// 构造函数, 第一种 给 TPtrC 设置缓冲区的方法
IMPORT_C TPtrC16 ();
IMPORT_C TPtrC16 ( const TDesC16 &aDes);
IMPORT_C TPtrC16 ( const TUint16 *aString); // 以“ 0 ” 结尾的字符串指针
IMPORT_C TPtrC16 ( const TUint16 *aBuf, TInt aLength); // 传递一个缓冲区的指针,设置 TPtrC 对象的长度
// 默认的拷贝构造函数
TPtrC ( const TPrtC &aDes);
// 可以通过 set 方法设置缓冲区, 第二种 给 TPtrC 设置缓冲区的方法
inline void Set ( const TUint16 *aBuf, TInt aLength);
inline void Set ( const TDesC16 &aDes);
inline void Set ( const TPtrC16 &aPtr);
//Set 方法不能改变缓冲区里面的数据,但是可以改变 TPtrC 对象指向的缓冲区
private :
TPtrC16 & operator= ( const TPtrC16 &aDes); //TPtrC 也重载了“ = ”
protected :
const TUint16 * iPtr ;
private :
__DECLARE_TEST ;
};
第三种 给 TPtrC 设置缓冲区的方法 ,直接通过其他缓冲区描述符获取 TPtrC 对象
_LIT (KText1, "YunYun/n" );
TBuf <100> bufText1;
bufText1. Copy (KText1);
TPtrC ptrcLeft = bufText1. Left (3);
TPtrC ptrcRight;
ptrcRight. Set (bufText1. Right (4));
TPtr //e32des16.h
基本用法
_LIT (KText1, "YunYun/n" );
TBufC <100> bufText1;
bufText1 = KText1;
_LIT (KText2, "YunYun" );
TBufC <30> bufText2(KText2);
TPtr ptr = bufText1.Des(); // 变成 Ptr 型的
ptr. Set (bufText2.Des());
ptr. AppendFormat ( _L ( " %d" ),20);
console-> Write (ptr);
// 通过指针描述符轻松的绕过了 TBufC 的不能修改的限制
// 还可以用这个
TText text[100];
TPtr ptrText(text,100);
类方法
class TPtr16 : public TDes16
{
public :
// 注意没有空的构造函数
IMPORT_C TPtr16 ( TUint16 *aBuf, TInt aMaxLength);
IMPORT_C TPtr16 ( TUint16 *aBuf, TInt aLength, TInt aMaxLength);
// 拷贝构造函数
TPtr ( TPtr & aTPtr);
// 重载的“ = ”运算符
inline TPtr16 & operator= ( const TUint16 *aString);
inline TPtr16 & operator= ( const TDesC16 & aDes);
inline TPtr16 & operator= ( const TPtr16 & aDes);
inline void Set ( TUint16 *aBuf, TInt aLength, TInt aMaxLength);
inline void Set ( const TPtr16 &aPtr);
private :
IMPORT_C TPtr16 ( TBufCBase16 &aLcb, TInt aMaxLength); // 注意这个是一个私有的方法
protected :
TUint16 * iPtr ;
private :
friend class TBufCBase16 ;
__DECLARE_TEST ;
};
实际开发过程中,很多时候是直接取得指向缓存区的指针描述符 TPtr 对象,然后使用 TPtr 对象操作缓冲区中的数据,常用的方法有下面两种
1 )取得 TBufC 的指针描述符
_LIT (KText2, "YunYun" );
TBufC <30> bufText2(KText2);
TPtr ptr = bufText1.Des(); // 变成 Ptr 型的
2 )取得缓冲区描述符 HBufC 的指针描述符
HBufC * pBuf = HBufC :: New (30);
TPtr ptrBuf = pBuf-> Des (); // 注意堆是 -> , TBufC 是 .
堆缓冲区描述符
HBufC
在堆上,要用 New 方法
class RReadStream ;
class HBufC16 : public TBufCBase16
{
public :
IMPORT_C static HBufC16 *New ( TInt aMaxLength);
IMPORT_C static HBufC16 *NewL ( TInt aMaxLength);
IMPORT_C static HBufC16 *NewLC ( TInt aMaxLength);
IMPORT_C static HBufC16 *NewMax ( TInt aMaxLength);
IMPORT_C static HBufC16 *NewMaxL ( TInt aMaxLength);
IMPORT_C static HBufC16 *NewMaxLC ( TInt aMaxLength);
IMPORT_C static HBufC16 *NewL ( RReadStream &aStream, TInt aMaxLength);
IMPORT_C static HBufC16 *NewLC ( RReadStream &aStream, TInt aMaxLength);
// 也重载了“ = ”操作符
IMPORT_C HBufC16 & operator= ( const TUint16 *aString);
IMPORT_C HBufC16 & operator= ( const TDesC16 &aDes);
inline HBufC16 & operator= ( const HBufC16 &aLcb);
IMPORT_C HBufC16 *ReAlloc ( TInt aMaxLength); // 失败返回 NULL ,且原来的 buffer 的内容不变
IMPORT_C HBufC16 *ReAllocL ( TInt aMaxLength); // 失败返回 Leave 。且原来的 buffer 的内容不变
IMPORT_C TPtr16 Des ();
private :
inline HBufC16 ( TInt aLength);
private :
TText16 iBuf [1];
__DECLARE_TEST ;
};
注意:
一旦重新分配,必须改变指向原来 buffer 的指针的指向,包括 cleanup stack 中的指针
HBufC * buf = HBufC :: New (15);
CleanupStack :: PushL (buf);
_LIT (KText, "YunYun/n" );
*buf = KText;
console-> Write (*buf);
buf = buf-> ReAlloc (20);
CleanupStack :: Pop (buf);
CleanupStack :: PushL (buf);
_LIT (KRepText, "&YunYun&&YunYun&/n" );
*buf = KRepText;
console-> Write (*buf);
CleanupStack :: PopAndDestroy (buf);