博客园丁

我是博客园的一丁,我会永不停顿,不停创新。
  首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

Symbian-Descriptor/String 字符串相关

Posted on 2006-11-02 20:53  Jason.Jiang  阅读(1504)  评论(0编辑  收藏  举报
我们写程序,几乎很少不跟字符串打交道的,所以字符串这一块儿自然成了一个平台的很重要一块儿。

因为Symbian系统是面向移动设备,用设计者的话说就是:资源受限的智能设备,另外它是基于ROM和RAM操作的,所以他们对于字符串的处理也是采用了一套自己独创的方式来进行。这样的机制,初学者乍看起来会很不习惯,摸不到头脑,不知道他为什么要这么做。不过可以这样说,跟她的内存资源处理机制相比,字符串方面Symbian所作的改动还只是相当于换了一个名称而已,对于ISV级的开发者来说,它是在众多Symbian系统中众多独有特性中最好掌握的几种之一。

在Symbian系统中,字符串被称为Descriptor,你不用知道为什么,就把它当作你熟悉的string也就好了。因为要对字符串进行操作,所以高级一些的平台,都把字符串写成了一个独立的类,当作对象来对他们处理,而不像是C中,字符串是char[],然后有一批函数来处理它。又考虑到Symbian系统所处理的字符串有在RAM中的也有在ROM中的,而RAM又是十分宝贵的,Symbian处理字符串提供了不止一个类,就在这里有了一点点不是那么直接的地方。
下面开始具体讲解一下我的理解,

在Symbian中,字符串的抽象类是TDes,它可以是TDes16业可以是TDes8,取决于你的程序是否处理Unicode。我们可以这样理解,TDes就是char[],不过它不以'\0'结尾,而是把长度信息保存在了头部,并且含有一个内存地址来表示他的位置。正如前面所述当今高级的平台构架,都会把字符串给分装成一个类,我们是把字符串当作一个对象来处理的,所以抽象类我们是不能直接定义一个实例来使用的,抽象类的作用,在于传递函数的参数,在这个时候我们可以把函数传递的参数当作最基本的抽象类来进行处理。那么要直接使用一个字符串,我们该使用什么呢?

情况分为两种,如果我们的字符串是比较短的,并且字符串的长度是相对已知的话,我们须要使用的是TBuf<len>,其中len表示长度。同样,TBuf是一个Unicode相关的类,他表示TBuf16或者TBuf8。定义这样类型的一个字符串,我们使用这样的语句
TBuf<100> buf100;
就可以定义一个字符串了。然后,参看TBuf类在SDK文档中的参考说明,我们就可以使用这样的字符串了。注意,使用TBuf是事先知道他的大概长度的,使用的时候不能溢出,否则会出现程序错误而导致退出。另外,据说TBuf是被分配在了很宝贵的地方,所以尽量不要分配很长的TBuf,我想如果你的TBuf长度超过了2000,哪怕是已知长度也最好换下面的第二种方式来分配好了。模拟器里面大家试验东西的时候可以分配很大很大的,没有问题,只不过用在真机上面的时候就要小心了。

另外一种,叫做HBufC,它是被分配在了Heap里面,可以在运行时才决定他的大小,不过也不能过大。定义一个HBufC我们可以使用下面的语句
HBufC* heapBuf=HBufC::NewL(100);
这样我们就定义了一个长度为100的heap字符串,需要注意的有几点。
1,使用它地抽象类部分,也就是把它当作字符串使用,需要用他的Des函数来返回他的TDes类,比如
heapBuf->Des()
,这样来调用HBufC的字符串部分。
2,因为Heap字符串是一个新分配的对象,所以你必须在使用完之后立即手动删除它。我使用的是delete heapBuf;来删除的,不过我觉得如果能够使用Symbian系统中提供的CleanupStack库来进行删除的话,可能会更好。我因为对这一方面还没有什么研究,所以不敢在这里举例子。
3,他的大小仍然是需要注意的,我的程序中分配过两个0x8000长的Heap字符串,没什么大问题。很早很早年少无知的时候,曾綺在0.9SDK的模拟器中一下子分配了1MegaByte的HBufC,没有任何问题。但是真机上面?_?_,我没有试验过,大家小心尝试~~~~

最后还有一种叫做TPtrC这样的东西,我们可以全当他是一个指针,指向一个TDes,其实可以当作是节省heapBuf->Des()的键盘消耗,我们可以定义一个TPtrC pBuf;然后pBuf=heapBuf->Des(); 从此我们就可以把pBuf当作一个TDes来处理了,我很少用TPtrC,所以也不太熟悉,不敢多说了。

需要注意的,
·在Symbian中,其实字符串都是按照Unicode编码保存的TDes16。
·我不知道为何在有的时候,定义'\n'是管用的,可是在EDWIN中,我却需要在TDes后面追价数值为0x2029的字符才可以换行。
·论坛中,或者其它网站[比如www.newlc.com],有介绍TDes16和TDes8之间的互转,请注意如果他们不是中国人,pure chinese,请注意他们是否会忽略中文处理,仅仅是简单的抛弃了高位为0的字节。如果是这样方法,我们最好还是考虑一下。三思而后行。

这些就是字符串相关了,大家还是多看看SDK Help中这个部分,可以获得很多很多
» Developer Library » API Reference » C++ API reference » Descriptors

参考资料:

·SDK Help中:
» Developer Library » Symbian OS Guide » Essential idioms » Descriptors