现在的位置: 首页 > 综合 > 正文

数据类型的相互转换方法

2013年11月23日 ⁄ 综合 ⁄ 共 5461字 ⁄ 字号 评论关闭

数据类型的相互转换方法      
  刚接触vc编程的朋友往往对许多数据类型的转换感到迷惑不解,本文将介绍一些常用数据类型的使用。  
   
  我们先定义一些常见类型变量借以说明  
   
  int   i   =   100;  
  long   l   =   2001;  
  float   f=300.2;  
  double   d=12345.119;  
  char   username[]="女侠程佩君";  
  char   temp[200];  
  char   *buf;  
  cstring   str;  
  _variant_t   v1;  
  _bstr_t   v2;  
   
  一、其它数据类型转换为字符串  
   
   
  短整型(int)  
  itoa(i,temp,10);///将i转换为字符串放入temp中,最后一个数字表示十进制  
  itoa(i,temp,2);   ///按二进制方式转换    
  长整型(long)  
  ltoa(l,temp,10);  
   
   
  二、从其它包含字符串的变量中获取指向该字符串的指针  
   
   
  cstring变量  
  str   =   "2008北京奥运";  
  buf   =   (lpstr)(lpctstr)str;    
  bstr类型的_variant_t变量  
  v1   =   (_bstr_t)"程序员";  
  buf   =   _com_util::convertbstrtostring((_bstr_t)v1);  
   
  三、字符串转换为其它数据类型  
  strcpy(temp,"123");    
   
  短整型(int)  
  i   =   atoi(temp);    
  长整型(long)  
  l   =   atol(temp);    
  浮点(double)  
  d   =   atof(temp);  
   
  四、其它数据类型转换到cstring  
  使用cstring的成员函数format来转换,例如:  
   
   
  整数(int)  
  str.format("%d",i);    
  浮点数(float)  
  str.format("%f",i);    
  字符串指针(char   *)等已经被cstring构造函数支持的数据类型可以直接赋值  
  str   =   username;  
   
  五、bstr、_bstr_t与ccombstr  
   
   
  ccombstr、_bstr_t是对bstr的封装,bstr是指向字符串的32位指针。  
  char   *转换到bstr可以这样:   bstr   b=_com_util::convertstringtobstr("数据");///使用前需要加上头文件comutil.h  
  反之可以使用char   *p=_com_util::convertbstrtostring(b);  
   
   
  六、variant   、_variant_t   与   colevariant  
   
   
  variant的结构可以参考头文件vc98/include/oaidl.h中关于结构体tagvariant的定义。  
  对于variant变量的赋值:首先给vt成员赋值,指明数据类型,再对联合结构中相同数据类型的变量赋值,举个例子:  
  variant   va;  
  int   a=2001;  
  va.vt=vt_i4;///指明整型数据  
  va.lval=a;   ///赋值  
   
  对于不马上赋值的variant,最好先用void   variantinit(variantarg   far*   pvarg);进行初始化,其本质是将vt设置为vt_empty,下表我们列举vt与常用数据的对应关系:  
   
  unsigned   char   bval;   vt_ui1    
  short   ival;   vt_i2    
  long   lval;   vt_i4    
  float   fltval;   vt_r4    
  double   dblval;   vt_r8    
  variant_bool   boolval;   vt_bool    
  scode   scode;   vt_error    
  cy   cyval;   vt_cy    
  date   date;   vt_date    
  bstr   bstrval;   vt_bstr    
  iunknown   far*   punkval;   vt_unknown    
  idispatch   far*   pdispval;   vt_dispatch    
  safearray   far*   parray;   vt_array|*    
  unsigned   char   far*   pbval;   vt_byref|vt_ui1    
  short   far*   pival;   vt_byref|vt_i2    
  long   far*   plval;   vt_byref|vt_i4    
  float   far*   pfltval;   vt_byref|vt_r4    
  double   far*   pdblval;   vt_byref|vt_r8    
  variant_bool   far*   pboolval;   vt_byref|vt_bool    
  scode   far*   pscode;   vt_byref|vt_error    
  cy   far*   pcyval;   vt_byref|vt_cy    
  date   far*   pdate;   vt_byref|vt_date    
  bstr   far*   pbstrval;   vt_byref|vt_bstr    
  iunknown   far*   far*   ppunkval;   vt_byref|vt_unknown    
  idispatch   far*   far*   ppdispval;   vt_byref|vt_dispatch    
  safearray   far*   far*   pparray;   vt_array|*    
  variant   far*   pvarval;   vt_byref|vt_variant    
  void   far*   byref;   vt_byref    
   
   
  _variant_t是variant的封装类,其赋值可以使用强制类型转换,其构造函数会自动处理这些数据类型。  
  例如:  
  long   l=222;  
  ing   i=100;  
  _variant_t   lval(l);  
  lval   =   (long)i;  
   
   
  colevariant的使用与_variant_t的方法基本一样,请参考如下例子:  
  colevariant   v3   =   "字符串",   v4   =   (long)1999;  
  cstring   str   =(bstr)v3.pbstrval;  
  long   i   =   v4.lval;  
   
   
  七、其它  
   
  对消息的处理中我们经常需要将wparam或lparam等32位数据(dword)分解成两个16位数据(word),例如:  
  lparam   lparam;  
  word   lovalue   =   loword(lparam);///取低16位  
  word   hivalue   =   hiword(lparam);///取高16位    
  对于16位的数据(word)我们可以用同样的方法分解成高低两个8位数据(byte),例如:  
  word   wvalue;  
  byte   lovalue   =   lobyte(wvalue);///取低8位  
  byte   hivalue   =   hibyte(wvalue);///取高8位    
     
   
  八、.字符转化时间  
   
   
  问:我想将字符转化为Ctime对象。  
  答:这有一个非常简单的函数,您可以在此上面加入你所需要的:  
  BOOL   ScanTime  
  (  
  Ctime   &time,   //   o   -   filled   in   time   structure  
  LPCTSTR   lpszTime,   //   I   -   the   string   containing   the   time   to  
  be   extracted  
  LPCTSTR   lpszFormat   //   I   -   the   time   format   to   extract  
  according   to  
  )  
  {  
  int   nYear   =   1980;   //   extracted   time   fields  
  int   nMonth   =   1;  
  int   nDay   =   1;  
  int   nHour   =   0;  
  int   nMin   =   0;  
  int   nSec   =   0;  
  int   nFlag   =   DATE_TIME;   //   DATE_TIME   /   DATE_ONLY   /   TIME_ONLY  
  Cstring   msg;//   start   at   the   beginning  
  char   *pTime   =   (char   *)lpszTime;  
  char   *pFmt   =   (char   *)lpszFormat;  
  while   (*pFmt   !=   '/0')  
  {  
  if   (*pFmt   ==   '%')  
  {  
  pFmt++;  
  switch   (*pFmt)  
  {  
  case   'Y'   :   //   year   with   century  
  sscanf   (pTime,"%4d",&nYear);  
  if   (nYear   <1980   ||   nYear>   2036)  
  {  
  msg.Format   ("Invalid   year   (%d)",nYear);  
  AfxMessageBox   (msg);  
  return   (FALSE);  
  }  
  pTime+=4;  
  break;  
  case   'y'   :   //   year   without   century   (00-99)  
  sscanf   (pTime,"%2d",&nYear);  
  nYear   =   nYear   +   (nYear   >   36   ?   1900   :   2000);  
  if   (nYear   <1980   ||   nYear>   2036)  
  {  
  msg.Format   ("Invalid   year   (%d)",nYear);  
  AfxMessageBox   (msg);  
  return   (FALSE);  
  }  
  pTime+=2;  
  break;  
  case   'm'   :   //   month   (01-12)  
  sscanf   (pTime,"%2d",&nMonth);  
  if   (nMonth   <1   ||   nMonth>   12)  
  {  
  msg.Format   ("Invalid   month   (%d)",nMonth);  
  AfxMessageBox   (msg);  
  return   (FALSE);  
  }  
  pTime+=2;  
  break;  
  case   'd'   :   //   day   of   month   (01-31)  
  sscanf   (pTime,"%2d",&nDay);  
  if   (nDay   <1   ||   nDay>   31)  
  {  
  msg.Format   ("Invalid   day   (%d)",nDay);  
  AfxMessageBox   (msg);  
  return   (FALSE);  
  }  
  pTime+=2;  
  break;  
  case   'H'   :   //   hour   (00-23)  
  sscanf   (pTime,"%2d",&nHour);  
  if   (nHour   <0   ||   nHour>   23)  
  {  
  msg.Format   ("Invalid   hour   (%d)",nHour);  
  AfxMessageBox   (msg);  
  return   (FALSE);  
  }  
  pTime+=2;  
  break;  
  case   'M'   :   //   minute   (00-59)  
  sscanf   (pTime,"%2d",&nMin);  
  if   (nMin   <0   ||   nMin>   59)  
  {  
  msg.Format   ("Invalid   minute   (%d)",nMin);  
  AfxMessageBox   (msg);  
  return   (FALSE);  
  }  
  pTime+=2;  
  break;  
  case   'S'   :   //   second   (00-59)  
  sscanf   (pTime,"%2d",&nSec);  
  if   (nSec   <1   ||   nSec>   31)  
  {  
  msg.Format   ("Invalid   second   (%d)",nSec);  
  AfxMessageBox   (msg);  
  return   (FALSE);  
  }  
  pTime+=2;  
  break;  
  default   :  
  msg.Format("Invalid   format   specifier   (%c)",*pFmt);  
  AfxMessageBox(msg);  
  return   (FALSE);  
  break;  
  }  
  }  
  else  
  {  
  if   (!isdigit((int)(*pTime)))  
  {  
  if   (*pTime   ==   *pFmt)  
  {  
  pTime++;  
  }  
  else  
  {  
  msg.Format   ("Character   mismatch   :   Expected   %c,   found  
  %c",*pFmt,*pTime);  
  AfxMessageBox   ((LPCTSTR)msg);  
  return   (FALSE);  
  }  
  }  
  }  
  pFmt++;  
  }  
  //   success  
  time   =   Ctime(nYear,nMonth,nDay,nHour,nMin,nSec);  
  return   (TRUE);  
  }  

抱歉!评论已关闭.