返回> 网站首页 

symbian 描述符转换

yoours2009-06-08 20:46:49 阅读 1120

简介一边听听音乐,一边写写文章。

TBuf<20> iBuf; 
TPtr iPtr((const_cast<TUint16*>(iBuf.Ptr())),iBuf.Length(), iBuf.Length()); 
HBufC *iHbuf;**
iBuf = iPtr; 
iBuf = iHbuf->Des(); 
iPtr.Set((const_cast<TUint16*>(iBuf.Ptr())),iBuf.Length(), iBuf.Length()); 
由上面可知指针型可以起堆型和栈型描述符的中间过渡的桥梁作用。 
不可修改向可修改描述符的转换 
原则1:通过不可修改描述符类内的Des()函数,将不可修改的描述符转换成可修改的指针描述符 
示例1:TBufC转换成TPtr 
************ _LIT(KText, "Test Data"); 
************ TBufC<10> 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"); 
TBuf8<20> iBuf8(KText);//描述符实际占用了9个字节9个8位描述符 
TBuf<20> iBuf16; 
//实现内存块的强转 
TPtrC16 ptr16(reinterpret_cast<const 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"); 
TBuf8<20> iBuf8; 
iBuf8.FillZ(20); 
iBuf8 = KText;//实际占用9字节9描述符 
TBuf<20> iBuf16; 
TPtr ptr16(reinterpret_cast<TUint16*>(const_cast<TUint8*>(iBuf8.Ptr())), 
**** ((iBuf8.Length()+1)/2),((iBuf8.Length()+1)/2)); 
iBuf16 = ptr16;//实际占用10字节5描述符,但是第10个字节为0零值,也即9字节大小有用 
注:其实这里用堆描述符来说明可能更好些,但是本人在调试过程中为了能够看到调试的效果,所以用了TBuf;而且个人觉得通常这种方法主要在文件读取等实际过程中用到,如果要转换为16位的话,肯定是偶数大小的8位描述符。 
原则2:重新构建内存块使用描述符的copy函数将8位字符的高字节置为0低字节不变,进行拷贝转换(我称其为保留描述符长度方法)。 
示例7 
_LIT8(KText , "Test Text"); 
TBuf8<20> iBuf8(KText);//实际占用了9个描述符9个字节 
TBuf<20> iBuf16; 
iBuf16.Copy(iBuf8);//实际占用了9个描述符18个字节 
原则3:使用charconv.lib内的API函数将8位的UTF8描述符转换为16位的Unicode 描述符 
CnvUtfConverter::ConvertToUnicodeFromUtf8(iBuf, iBuf8); 
注:在使用这种方法时除了包含charconv.lib库,还应该包含utf.h头文件 
原则4:使用GBK转Unicode的方法 
注:原则3和4是我在实际中常用的方法,涉及到各种编码的问题,暂时不做大的展开,下次使用中文的整理时再展开。 
16位到8位的描述符转换 
原则1:通过将一个16位描述符拆分为两个8位描述符的方法实现内存不动,内存块类型强转(我称其为保留描述符字节大小方法) 
示例8 
_LIT(KText , "Test 文本"); 
TBuf<20> iBuf(KText);//描述符实际占用了14个字节7个16位描述符********************************************************//实现内存块的强转 
TPtrC8 ptr8(reinterpret_cast<const TUint8*>(iBuf.Ptr()), (iBuf.Size())); 
//真实的内存不动已经结束,这里是重新申请了一块内存并实现内存赋值拷贝 
TBuf8<20> iBuf8; 
iBuf8 = ptr8;//描述符实际占用了14个字节14个8位描述符 
以上 
原则2:重新构建内存块使用描述符的copy函数将16位描述符的,进行拷贝转换(我称其为保留描述符长度方法)。 
示例9: 
_LIT(KText , "Test 文本"); 
TBuf<20> iBuf(KText);// 描述符实际占用了14个字节7个16位描述符 
TBuf8<20> iBuf8; 
iBuf8.Copy(iBuf);//描述符实际占用了7个字节7个描述符,非ASCII字符值转为1 
注:该种方法在纯ASCII码的转换时可行,其它数据大于255的时候就会丢失数据。 
原则3:使用charconv.lib内的API函数将16位的Unicode描述符转换为8位的UTF8描述符。 
CnvUtfConverter::ConvertFromUnicodeToUtf8(iBuf8, iBuf); 
原则4:使用Unicode转GBK的方法 
由于最近做通信模块时组解包用的比较多,为此经常会将memcpy,strcpy,sprintf,sscanf等函数在char字符串和描述符串内存块之间的直接使用,个人觉得描述符一旦取得了后面数据区的首指针,那么内存块的这些操作没有什么好展开,直接用函数大家都会,当然本人也推荐读者使用文后的char字符串和Symbian描述符串的转换方法。 
在整理过程种,也有其它类型与描述符的转换,我就摘录在本文后面作为mark和备查: 
1.********TTime转TBuf型 
TBuf<32> theTime;//存储转换后的时间 
TTime tt; 
tt.HomeTime(); 
_LIT(KTimeFormat,"%Y%M%D%1-%2-%3 %H:%T:%S");//格式为:2006-03-04 12:12:12 
tt.FormatL(theTime,KTimeFormat); 
2.********TDateTime转TBuf型 
TTime currentTime;//声明一个TTime类型 
currentTime.HomeTime();//设置TTime为当前时间 
TDateTime tdt=currentTime.DateTime();//TTime****--->****TdateTime 
TBuf<32> tmp;//存储转换完的Buf 
tmp.AppendNum(tdt.Year());//用AppendNum()方法将一个Tint加入到TBuf中。 
_LIT(gang,"-");//声明一个横线分隔年月日,同样可声明冒号分隔小时分秒 
tmp.Append(gang); 
tmp.AppendNum(tdt.Month()); 
tmp.Append(gang); 
tmp.AppendNum(tdt.Day());//…………时分秒的转换同上 
3.********TBuf和Tint互转型 
// 15位数字 
TInt iNum1(123456789009876); 
// TInt转TBuf 
iBuf.Num(iNum1);//当buf只用来转Tint时可以使用AppendNum,但是性质是不一样的 
// 使用iBuf包含的内容创建TLex对象 
TLex iLex(iBuf); 
TInt iNum2; 
//TBuf转TInt 
iLex.Val(iNum2);// Num2现在包含了15位数字 
4.********TBuf转TDateTime型 
将长的TBuf截成小段,分别是年月日时分秒,通过下面TBuf转TInt ,再分别把转换成TInt的年月日取出,通过TDateTime的setYear(),setMonth()等方法将时间set进TdateTime。 
5. .将symbian串转换成char串 
char* p = NULL; 
TBuf8<20> buf( _L( "aaaaa" ) ); 
p = (char *)buf.Ptr(); 
6.将char串转换成symbian串 
char* cc = "aaaa"; 
TPtrC8 a; 
a.Set((const TUint8*)cc , strlen(cc) );
微信小程序扫码登陆

文章评论

1120人参与,0条评论