`
love19820823
  • 浏览: 931422 次
文章分类
社区版块
存档分类
最新评论

Symbian编程-基础篇-描述符简介

 
阅读更多
一、强化印象

  在学习描述符之前,首先要理解Symbian中描述符的作用。在Symbian中,没有提供专门用来处理字符串的类,它把字符串和二进制缓冲区看成是同一类数据,有一套专门的类去管理,这一套类的类关系图层次结构如下图所示:

Symbian编程总结-基础篇-描述符(1)-描述符简介

  图一. 描述符类的层次关系

  上图所示的类统称为“描述符”,Symbian用“描述符”来管理字符串,其中,TDesC、TDes、TBufCBase为抽象类。

  我们首先来举一个简单的例子,来强化我们对描述符的理解。如果我们由一个字符串“NewLC”,我们想使用变量存放,在C语言中,我们可以使用如下代码编写:

char[] c = “NewLC”;
const char* c = “NewLC”;

  而在Symbian C++中,我们应该使用以上那个描述符存放呢?

  答案是:你可以使用任一描述符存放!我们不给代码,先向大家展示一下使用不同的描述符存放字符串在内存中的存放形式:

Symbian编程总结-基础篇-描述符(1)-描述符简介

  图二. 描述符对象与数据在内存中的位置

  二、理解概念

  1、根据描述符数据存放位置进行分类(如图二):

  栈描述符TBuf和TBufC:数据做为描述符对象的组成部分而存在,描述符对象存放在程序的栈中,就像C语言中的字符数组(char[])。

  堆描述符HBufC:数据做为描述符对象的组成部分而存在,描述符对象存放在堆中,就像C语言中的(char*)malloc( length+1 )一样通常用于预先不能确定长度的情况。因为是在堆上分配的,它总是通过HBufC*使用而不是直接定义HBufC对象。

指针描述符TPtr和TPtrC:描述符对象和它所表示的实际数据是分开存放的,描述符对象存放在栈中,正如“指针”的含义,指针描述符所指向的数据可以为栈中的数据,也可为堆中的数据。TPtrC和TPtr与C语言中的char*有点儿类似,但因为描述符自己包含了长度信息,所以不再需要扫描结尾的空字符(‘’)或为它分配空间。

  2、可修改的描述符与不可修改的描述符:

  大家可以看到,在描述符类中,有些类结尾带“C”,这些类表示“只读的描述符”,即:描述符在定义时拥有的数据或指向的数据,描述符不提供修改的方法。所以,推荐使用以下方法声明可修改的描述符和不可修改的描述符:

const TDesC& str;
TDesC& str;

  可以从图一看到,基类TDesC没有提供对内容修改的函数,而继承自TDesC的类TDes提供了对内容修改的函数。

  3、描述符的宽度

  所有这些描述符都可以指定数据尺度:TDes8、TDes16、TDesC8、TDesC16、TBuf8、TBuf16等

  这里8表示描述符处理的数据是8bit的,而16表示是16bit数据。一般来说,你只要使用通用形式(TDes, TDesC,…)来表示文本数据而使用8bit版本(TDesC8等)来表示二进制的内容。

  三、描述符的使用

  1、使用宏_LIT(_LIT16,_LIT8)和_L定义字符串常量

  _L()可以生成一个指向字符值的地址(TPtrC),它经常被用来传递字符串到函数中:

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

  _LIT()可以生成个常量名,以便以后重复使用:

_LIT(KMyFile, “c:SystemAppsMyAppMyFile.jpg”);

_LIT()宏的结果(就是上面的KMyFile)实际上是个文字描述符(literal descriptor)TLitC,它可以在任何使用TDesC&的地方使用。

  2、系统定义的描述符

  KNullDesC(KNullDesC16, KNullDesC8)

_LIT16(KNullDesC, "");

  表示空或者无文本的16位(8位)格式描述符。

  3、构造描述符

  TBufC(不可修改的栈描述符)

_LIT(KHelloWorld, "Hello World");
const TInt maxBuf = 32;
TBufC<maxbuf> buf;
TInt currentLen = buf.Length(); // == 0
buf = KHelloWorld;
currentLen = buf.Length(); // == 11
TText ch = buf[2]; // == ''l''

  TBuf(可修改的栈描述符)

const TInt bufLen = 6;
TUInt8 objType = 1;
TUInt8 objId = 1;
TUInt8 xCoord = 128;
TUInt8 yCoord = 192;
....
TBuf8<bufLen> buf;
buf.Append(objType);
buf.Append(objId);
...
// 我们能够使用buf做一些事情,如:将buf写入文件或者通过Socket发送

  TPtrC(不可修改的指针描述符)

const unsigned char KBuffer[] = {0x00, 0x33, 0x66, 0x99, 0xbb, 0xff};
TPtrC8 bufferPtr( KBuffer, sizeof(KBuffer));
iSocket.Write(bufferPtr, iStatus);

  TPtr(可修改的指针描述符)

_LIT(KHelloWorld, "Hello World");
const TInt maxBuf = 32;
TBufC<maxBuf> buf;
buf = KHelloWorld;
TPtr ptr = buf.Des();
ptr[7] = ''a''; ptr[8] = ''l''; ptr[9] = ''e''; ptr[10] = ''s'';
CEikonEnv::Static()->InfoMsg(ptr); // "Hello Wales"

  HBufC(堆描述符)

HBufC* heapBuf = HBufC::NewL(KHelloWorld().Length());
*heapBuf = KHelloWorld();
delete heapBuf;

  4、使用描述符

  Ptr(),用来获得描述符数据中的指针。

  Length(),用来获得描述符数据中的字符数。

  Size(),用来获得描述符数据中的字节数目。

  Cpmpare()或操作符==、!=、<=和>=等专为比较描述符数据用的。

  操作符[],可以被当作c/c++中一样,用来获得描述符字符串中的单个字符。

  Append()和Num()有很多重载形式,具体可以看SDK

  Compare()有2个变体:CompareC()和CompareF(),以及Copy(),Find(),Locate()和Match(),这些函数都有C/F的后缀形式,C代表Collated而F代表Folded。Folding是个比较格式化文本的简单方法,主要用在对比较不是太要求精确的场合。Collation是个更好的也更有效的比较字符串的方法,可以生成类似字典的顺序。

分享到:
评论

相关推荐

    Symbian编程总结-基础篇-活动对象正解

    Symbian编程总结-基础篇-活动对象正解(1) Symbian编程总结-基础篇-活动对象正解(2)-使用活动对象 Symbian编程总结-基础篇-活动对象正解(3)-活动对象的工作原理 Symbian编程总结-基础篇-活动对象正解(4)-异步...

    symbian 14描述符 第一节

    symbian 14描述符 第一节 symbian 14描述符 第一节 symbian 14描述符 第一节 symbian 14描述符 第一节 symbian 14描述符 第一节 symbian 14描述符 第一节

    SymbianOS中的描述符.doc

    SymbianOS中的描述符.doc SymbianOS中的描述符.doc SymbianOS中的描述符.doc SymbianOS中的描述符.doc

    SymbianOS中的描述符.txt

    SymbianOS中的描述符.txt SymbianOS中的描述符.txt SymbianOS中的描述符.txt SymbianOS中的描述符.txt

    symbian ---SDK.doc

    symbian ---SDK symbian ---SDK

    symbian描述符使用范例

    symbian 描述符使用 范例 详细介绍了symbian TBuf TPtr TPtrC TBufC的用法

    Symbian C++ 高效编程

    全书共分为21章,分别介绍了Symbian OS中的类命名约定、异常退出、清除栈、两段构造、描述符、良好的描述符风格、动态的数组与缓冲区、使用活动对象的事件驱动多任务、活动对象、Symbian OS的线程与进程、客户/...

    Symbian描述符详解文档

    学习Symbian的描述符,这里有详细的学习文档 介绍详细,有实例代码

    智能手机操作系统编程Symbian及60系列【PDF格式】

    智能手机操作系统编程Symbian及60系列【PDF格式】 用这个做参考资料,最合适不过了。

    symbian描述符转换。

    symbian 描述符转换的过程转换的过程转换的过程转换的过程转换的过程转换的过程转换的过程转换的过程转换的过程转换的过程

    塞班S60-V3 嘟嘟录音

    塞班S60-V3 嘟嘟录音塞班S60-V3 嘟嘟录音塞班S60-V3 嘟嘟录音塞班S60-V3 嘟嘟录音

    symbian 描述符

    诺基亚官方培训笔记Symbian描述符 详细的介绍了Symbian中的描述符

    Symbian运行环境-概念篇

    运行环境的需求、要素、与底层系统集成、运行环境的发展趋势

    Symbian OS C++ 编程诀窍【-----请下载本人提供的另一个版本----】

    Symbian OS C++ 编程诀窍.chm 【-----请下载本人提供的另一个版本----】 章节【3.1----6.3】 图书版权归出版社和作者所有,CSDN & DearBook独家提供试读和连载 仅作学习用,禁止用于商业用途,保护作者合法权益

    智能手机操作系统编程Symbian及60系列.pdf

    开发环境,基础知识,应用程序设计,控件,多媒体 ,网络通信,消息等相关介绍

    RBuf描述符介绍,pdf格式

    关于symbian描述符的使用,官方资料,pdf格式

    symbian各种描述符类型转换

    赞了好久的好东东,今天拿出来分享了 symbian各种描述府类型转化

    塞班论坛----塞班证书签名程序

    适用于s60第三版系统~给把sis或sisx的程序签名,让其可以顺利的安装在诺基亚等塞班系统的手机里面~

    Symbian OS C++高效编程

    OS中的字符串 415.1 不可修改的描述符 425.2 可修改的描述符 435.3 指针描述符 445.4 基于栈的缓冲描述符 475.5 基于堆的缓冲描述符 495.6 字面描述符 515.7 小结 54第6章 良好的描述符风格 566.1...

    Symbian OS 高效编程

    全书共分为21章,分别介绍了Symbian OS中的类命名约定、异常退出、清除栈、两段构造、描述符、良好的描述符风格、动态的数组与缓冲区、使用活动对象的事件驱动多任务、活动对象、 Symbian OS的线程与进程、客户/...

Global site tag (gtag.js) - Google Analytics