Symbin 描述符(下)转换.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Symbin 描述符(下)转换

描述符下转换 业余有时候把一个事情当作任务来做的时候,往往会很受限制,就象这篇文档,上次写了个上篇,关于描述符的下篇,自己就迟迟没有勇气和时间写完,好几次都想静下心来好好完成它,但是都未能如愿,可如果不写显然我也不好意思写其它的一些东西,闲话提到这里,花了几天业余时间总算是完成了,该文质量不足之处还望读者您见谅。 通过前面关于描述符概念和使用的简单描述,下面我们直接进入描述符转换的主题。 虽然描述符有五类,但是作为描述符变量用的,只有三类即栈描述符、堆描述符、指针描述符。所以本文所述描述符的转换也只是在这三种类型间展开,这三类描述符之间的互相转换其实可以用下面这种伪代码方式给出: TBuf20 iBuf; TPtr iPtr((const_castTUint16*(iBuf.Ptr())),iBuf.Length(), iBuf.Length()); HBufC *iHbuf; iBuf = iPtr; iBuf = iHbuf-Des(); iPtr.Set((const_castTUint16*(iBuf.Ptr())),iBuf.Length(), iBuf.Length()); 由上面可知指针型可以起堆型和栈型描述符的中间过渡的桥梁作用。 不可修改向可修改描述符的转换 原则1:通过不可修改描述符类内的Des()函数,将不可修改的描述符转换成可修改的指针描述符 示例1:TBufC转换成TPtr _LIT(KText, Test Data); TBufC10 NBuf ( KText ); TPtr Pointer = NBuf.Des(); 示例2:HBufC转换成TPtr HBufC * Buf = HBufC::NewL(15); _LIT (KText , Test Text); *Buf = KText; TPtr Pointer = Buf-Des(); 原则2:通过TPtr的构造函数或Set()函数可以将TPtrC描述转换为可修改的指针描述符 示例3:TPtrC到TPtr const TText * text1 = _S(Hello World\n); TPtrC Ptr1(text1); TPtrC Ptr2(Ptr1); //可以通过构造函数 TPtr Ptr3((TUint16 *)(Ptr1.Ptr()), Ptr1.Length()); //也可以通过Set()函数 Ptr3.Set((TUint16 *)(Ptr1.Ptr()),Ptr1.Length(), Ptr1.Length()); 8位和16位之间的描述符转换 8位到16位的描述符转换 原则1:通过将两个8位描述符的内容合并为一个16位描述符的方法实现内存不动,内存块类型强转(我称其为保留描述符字节大小方法)。 示例4:8bit To 16bit保留描述符字节大小方法1 _LIT8(KText , Test Text); TBuf820 iBuf8(KText);//描述符实际占用了9个字节9个8位描述符 TBuf20 iBuf16; //实现内存块的强转 TPtrC16 ptr16(reinterpret_castconst TUint16*(iBuf8.Ptr()), (iBuf8.Length()/2)); //真实的内存不动已经结束,这里是重新申请了一块内存并实现内存赋值拷贝 iBuf16 = ptr16;//描述符实际占用了8个字节4个16位描述符,导致数据丢失 由上面的这个例子明显是丢失了数据了,原因就出在设置长度时用了(iBuf8.Length()/2),为了剔除错误,我后来改了一个新的示例6 示例6:8bit To 16bit保留描述符字节大小方法2(由于上例用了TPtrC,所以该例使用TPtr指针,以扩展应用) _LIT8(KText , Test Text); TBuf820 iBuf8; iBuf8.FillZ(20); iBuf8 = KText;//实际占用9字节9描述符 TBuf20 iBuf16; TPtr ptr16(reinterpret_castTUint16*(const_castTUint8*(iBuf8.Ptr())), ((iBuf8.Length()+1)/2),((iBuf8.Length()+1)/2)); iBuf16 = ptr16;//实际占用10字节5描述符,但是第10个字节为0零值,也即9字节大小有用 注:其实这里用堆描述符来说明可能更好些,但是本人在调试过程中为了能够看到调试的效果,所以用了TBuf;而且个人觉得通常这种方法主要在文件读取等实际过程中用到,如果要转换为16位的话,肯定是偶数大小的8位描述符。 原则2:重新构建内

文档评论(0)

skewguj + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档