Symbian C++ 各种类型之间的转换

 

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);//FormatL()会以KTimeFormat字符串的形式来格式化时间在赋值给theTime

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);
// 将缓存的内容设置为iNum1
iBuf.Num(iNum1);
// 使用iBuf包含的内容创建TLex对象
// the 15 digit number
TLex iLex(iBuf);
// iNum1
TInt iNum2;
//iNum2现在包含了15位数字
iLex.Val(iNum2);

4. Tint转TBuf型 

TBuf<10>tmp;
Tint ti=190;
Tmp.AppendNum(ti);

5. TBuf转TDateTime型 

将长的TBuf截成小段,分别是年月日时分秒,通过下面TBuf转TInt ,再分别把转换成TInt的年月日取出,通过TDateTime的setYear(),setMonth()等方法将时间set进TDateTime

6. 其他转换 

TBuf    转换为 TPtrC16

TBuf<32> tText(_L("2004/11/05 05:44:00"));
TPtrC16 tPtrSecond=tText.Mid(17,2);

TPtrC16 转换为 TBufC16

TPtrC16 tPtrSecond=tText.Mid(17,2);
TBufC16<10> bufcs(tPtrSecond);

TBufC16 转换为    TPtr16

TBufC16<10> bufcs(tPtrSecond);
TPtr16 f=bufcs.Des();

TPtr16 转换为 TBuf

TBuf<10> bufSecond;
bufSecond.Copy(f);

TBuf 转换为 TPtr16

TBuf<10> bufSecond(_L("abc"));
TPtr16 f;
f.Copy(bufSecond);

TBuf 转换为 TInt

      TInt aSecond;
      TLex iLexS(bufSecond);
      iLexS.Val(aSecond);

TInt 转换为 TBuf

      TBuf<32> tbuf;
      TInt i=200;
      tbuf.Num(i);

memset主要应用是初始化某个内存空间。用来对一段内存空间全部设置为某个字符。
memcpy是用于COPY源空间的数据到目的空间中,用来做内存拷贝可以拿它拷贝任何数据类型的对象。
strcpy只能拷贝字符串了,它遇到'/0'就结束拷贝。

以下是S60的数据类型转换(巨有用) 

1.串转换成数字

     TBuf16<20> buf(_L( "123" ) );
      TLex lex( buf );
      TInt iNum;
      lex.Val( iNum );

2.数字转换成串

     TBuf16<20> buf;
     TInt iNum = 20;
     buf.Format( _L( "%d" ) , iNum    );

3.将symbian串转换成char串

      char* p = NULL;
      TBuf8<20> buf( _L( "aaaaa" ) );
      p = (char *)buf.Ptr();

4.UTF-8转换成UNICODE

      CnvUtfConverter::ConvertToUnicodeFromUtf8( iBuf16 , iBuf8 );

5.UNICODE转换成UTF-8

      CnvUtfConverter::ConvertFromUnicodeToUtf8( iBuf8 , iBuf16 );

6.将char串转换成symbian串

      char* cc = "aaaa";
      TPtrC8 a;
      a.Set( (const TUint8*)cc , strlen(cc) );

再加一点: 

TDesC8 & buf ;
TUint8     * pdata ;
pdata = buf.Ptr() ;
然后,这个pdata就可以当成unsigned char *用了,这在网络通讯的时候很重要。
如果,怕pdata破坏的话,可以
TBuf8<1024> tmp_buf ;
tmp_buf.Copy(buf) ;
pdata = tmp_buf.Ptr() ;
这样就可以保护一下buf的数据了,尤其是如果这个buf是Socket的接收的数据是接收函数自己分配的时候。



strcpy

原型:extern char *strcpy(char *dest,char *src);
用法:#include <string.h>
功能:把src所指由NULL结束的字符串复制到dest所指的数组中。
说明:src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。

         返回指向dest的指针。

memcpy

原型:extern void *memcpy(void *dest, void *src, unsigned int count);
用法:#include <string.h>
功能:由src所指内存区域复制count个字节到dest所指内存区域。
说明:src和dest所指内存区域不能重叠,函数返回指向dest的指针。

memset

原型:extern void *memset(void *buffer, int c, int count);
用法:#include <string.h>
功能:把buffer所指内存区域的前count个字节设置成字符c。
说明:返回指向buffer的指针。

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中。

TBuf和const char*的转换 收藏

TBuf和const char*的转换

http://wiki.forum.nokia.com/index.php/How_to_Convert_TBuf_to_Char_and_Vice_Versa

How to Convert TBuf to Char and Vice Versa
From Forum Nokia Wiki

void stringToDescriptor(const char* aString, TDes& aDescriptor)
{
    TPtrC8 ptr(reinterpret_cast<const TUint8*>(aString));
    aDescriptor.Copy(ptr);
}

Usage:

const char* str = "Hello, world!";
    TBuf<32> buffer;  // Make it large enough for str
    stringToDescriptor(str, buffer);

Problem with the code above is that defining a TBuf not large enough will raise a USER 23 panic.

Some ways to avoid this include:

Using either __ASSERT_DEBUG or __ASSERT_ALWAYS, depending on your needs. Note that you can use alternatives to User::Panic(), as long as you avoid executing sensitive code.

void stringToDescriptor(const char* aString, TDes& aDescriptor)
{
    TPtrC8 ptr(reinterpret_cast<const TUint8*>(aString));
    _LIT(KMyPanicDescriptor, "My panic text");
    __ASSERT_ALWAYS(User::StringLength(reinterpret_cast<const TUint8*>(aString))
 <= aDescriptor.MaxLength(), User::Panic(KMyPanicDescriptor, 0));
    aDescriptor.Copy(ptr);
}

The other way is relying on a dynamic buffer, using HBufC for instance:

HBufC* stringToDescriptorL(const char* aString)
{
    TPtrC8 ptr(reinterpret_cast<const TUint8*>(aString));
    HBufC* buffer = HBufC::NewL(ptr.Length());
    buffer->Des().Copy(ptr);
 
    return buffer;
}

Note that the caller is responsible of freeing the HBufC returned. Also note the trailing "L" in the function's name.

Depending on your code, you may prefere one of these over the others. Also, you may need to add extra checks (for instance, checking whether the char pointer is null or not).

Converting descriptors to C-strings may be done this way:

const char* descriptorToStringL(const TDesC& aDescriptor)
{
    TInt length = aDescriptor.Length();
 
    HBufC8* buffer = HBufC8::NewLC(length);
    buffer->Des().Copy(aDescriptor);
 
    char* str = new(ELeave) char[length + 1];
    Mem::Copy(str, buffer->Ptr(), length);
    str[length] = '/0';
 
    CleanupStack::PopAndDestroy(buffer);
 
    return str;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值