码迷,mamicode.com
首页 > 编程语言 > 详细

C++数据类型转换

时间:2020-01-21 16:26:49      阅读:105      评论:0      收藏:0      [点我收藏+]

标签:需要   重载   正数   内存   实现   ova   display   赋值   基本   

一、其他类型转为字符串

1、数值型

技术图片
1 itoa(i,temp,10);    //将i转换为字符串放入temp中,最后一个数字表示十进制  
2 ltoa(l,temp,10);    //长整形转为字符串放入temp中,最后一个数字表示十进制
3 
4 //浮点数
5 int decimal, sign;   
6 char *buffer;   
7 double source = 3.1415926535;   
8 buffer = _fcvt( source, 7, &decimal, &sign ); 
9 decimal表示小数点的位置,sign表示符号:0为正数,1为负数
View Code

2、字符型

技术图片
 1 CString变量:
 2     buf = (LPSTR)(LPCTSTR)str;  
 3 
 4 BSTR变量:
 5     BSTR bstrValue = ::SysAllocString(L"hello world!");  
 6     char *buf = _com_util::ConvertBSTRToString(bstrVar.m_str); 
 7 
 8 CComBSTR变量:
 9     CComBSTR bstrVar("hello world!");   
10     char *buf = _com_util::ConvertBSTRToString(bstrVar.m_str);  
11 
12 _bstr_t变量:
13     _bstr_t bstrVar("hello world!");   
14     const char *buf = bstrVar;    //不要修改buf中的内容
View Code

二、字符串转其他类型

1、数值型

技术图片
1 i = atoi(temp);    //整数型
2 l = atol(temp);    //长整型
3 d = atof(temp);    //浮点型
View Code

2、字符型

技术图片
 1 CString变量:
 2     CString name = temp;     //直接赋值
 3 
 4 BSTR变量:
 5     BSTR bstrValue = ::SysAllocString(L"hello world!"); 
 6 
 7 CComBSTR变量:
 8     CComBSTR bstrVar2(temp);     //直接赋值
 9 
10 _bstr_t变量:
11     _bstr_t bstrVar2(temp);     //直接赋值
View Code

三、转为CString

  数值型使用CString的成员函数Format来转换。字符串指针(char *)等已经被CString构造函数支持的数据类型可以直接赋值。对于Format所不支持的数据类型,可以通过上面所说的关于其它数据类型转化到char *的方法先转到char *,然后赋值给CString变量。

  示例:str.Format("%d",i); str = username; 

四、BSTR、_bstr_t与CComBSTR

  CComBSTR 是ATL对BSTR的封装,_bstr_t是C++对BSTR的封装,BSTR是32位指针,但并不直接指向字串的缓冲区。

1、char * <==> BSTR

BSTR b=_com_util::ConvertStringToBSTR("hello");
//使用前需要加上comutil.h和comsupp.lib

char *p=_com_util::ConvertBSTRToString(b);
//或者可以直接赋值:char *p = b;

  CComBSTR与_bstr_t对大量的操作符进行了重载,可以直接进行=,!=,==等操作,所以使用非常方便。特别是_bstr_t,建议大家使用它。

赋值时若字符串较大,会出现内存读写错误的情况。

五、VARIANT 、_variant_t 与 COleVariant

  VARIANT的结构可以参考头文件VC98\Include\OAIDL.H中关于结构体tagVARIANT的定义。对于VARIANT变量的赋值:首先给vt成员赋值,指明数据类型,再对联合结构中相同数据类型的变量赋值。如下:

1 VARIANT va;  
2 int a=122;  
3 va.vt=VT_I4;    //指明整型数据  
4 va.lVal=a;        //赋值  

对于不马上赋值的VARIANT,最好先用Void VariantInit(VARIANTARG FAR* pvarg);进行初始化,其本质是将vt设置为VT_EMPTY。

1、VARIANT的结构与常用数据的对应关系

技术图片
 1 Byte bVal;                // VT_UI1   
 2 Short iVal;                // VT_I2   
 3 long lVal;                // VT_I4   
 4 float fltVal;            // VT_R4   
 5 double dblVal;            // VT_R8   
 6 VARIANT_BOOL boolVal;    // VT_BOOL   
 7 SCODE scode;            // VT_ERROR   
 8 CY cyVal;                // VT_CY   
 9 DATE date;                // VT_DATE   
10 BSTR bstrVal;            // VT_BSTR   
11 DECIMAL FAR* pdecVal    // VT_BYREF|VT_DECIMAL   
12 IUnknown FAR* punkVal;  // VT_UNKNOWN   
13 IDispatch FAR* pdispVal;    // VT_DISPATCH   
14 SAFEARRAY FAR* parray;        // VT_ARRAY|*   
15 Byte FAR* pbVal;            // VT_BYREF|VT_UI1   
16 short FAR* piVal;            // VT_BYREF|VT_I2   
17 long FAR* plVal;            // VT_BYREF|VT_I4   
18 float FAR* pfltVal;            // VT_BYREF|VT_R4   
19 double FAR* pdblVal;        // VT_BYREF|VT_R8   
20 VARIANT_BOOL FAR* pboolVal;  // VT_BYREF|VT_BOOL   
21 SCODE FAR* pscode;            // VT_BYREF|VT_ERROR   
22 CY FAR* pcyVal;                // VT_BYREF|VT_CY   
23 DATE FAR* pdate;            // VT_BYREF|VT_DATE   
24 BSTR FAR* pbstrVal;            // VT_BYREF|VT_BSTR   
25 IUnknown FAR* FAR* ppunkVal;    // VT_BYREF|VT_UNKNOWN   
26 IDispatch FAR* FAR* ppdispVal;  // VT_BYREF|VT_DISPATCH   
27 SAFEARRAY FAR* FAR* pparray;    // VT_ARRAY|*   
28 VARIANT FAR* pvarVal;            // VT_BYREF|VT_VARIANT   
29 void FAR* byref;                // Generic ByRef   
30 char cVal;                        // VT_I1   
31 unsigned short uiVal;            // VT_UI2   
32 unsigned long ulVal;            // VT_UI4   
33 int intVal;                        // VT_INT   
34 unsigned int uintVal;            // VT_UINT   
35 char FAR * pcVal;                // VT_BYREF|VT_I1   
36 unsigned short FAR * puiVal;    // VT_BYREF|VT_UI2   
37 unsigned long FAR * pulVal;        // VT_BYREF|VT_UI4   
38 int FAR * pintVal;                // VT_BYREF|VT_INT   
39 unsigned int FAR * puintVal;    //VT_BYREF|VT_UINT
View Code

2、_variant_t和COleVariant

  _variant_t是VARIANT的封装类,其赋值可以使用强制类型转换,其构造函数会自动处理这些数据类型。使用时需加上#include <comdef.h>

技术图片
1 long l=222;  
2 int i=100;  
3 _variant_t lVal(l);  
4 lVal = (long)i;  
View Code

COleVariant的使用与_variant_t的方法基本一样:

技术图片
1 COleVariant v3 = "hello";
2 COleVariant  v4 = (long)1999;  
3 CString str =(BSTR)v3.pbstrVal;  
4 long i = v4.lVal;  
View Code

六、其他类型

根据ProgID得到CLSID:
    HRESULT CLSIDFromProgID( LPCOLESTR lpszProgID,LPCLSID pclsid);

根据CLSID得到ProgID:
    WINOLEAPI ProgIDFromCLSID( REFCLSID clsid,LPOLESTR * lplpszProgID);   

已定义了CLSID_IApplication,可使用:
    LPOLESTR pProgID = 0;  
    //可以使用pProgID
    ProgIDFromCLSID( CLSID_IApplication,&pProgID);           
    CoTaskMemFree(pProgID);//不要忘记释放        

七、ANSI与Unicode

  Unicode称为宽字符型字串,COM里使用的都是Unicode字符串。

1、将ANSI转换到Unicode

技术图片
 1 通过L这个宏来实现:
 2     CLSIDFromProgID( L"xxxx",&clsid); 
 3 
 4 通过MultiByteToWideChar函数实现转换:
 5     char *szProgID = "xxxx";  
 6     WCHAR szWideProgID[128];  
 7     CLSID clsid;  
 8     long lLen =   MultiByteToWideChar(CP_ACP,0,szProgID,
 9             strlen(szProgID),szWideProgID,sizeof(szWideProgID));  
10     szWideProgID[lLen] = \0; 
11   
12 通过A2W宏来实现:
13     CLSIDFromProgID( A2W(szProgID),&clsid);
View Code

2、将Unicode转换到ANSI

技术图片
1 使用WideCharToMultiByte:
2     WideCharToMultiByte ( CP_ACP, WC_COMPOSITECHECK, wszSomeString, -1, szANSIString, sizeof(szANSIString), NULL, NULL ); 
3 
4 使用W2A宏来实现:
5     pTemp=W2A(wszSomeString);
View Code

八、其他

1、数据分解

  对消息的处理中我们经常需要将WPARAM或LPARAM等32位数据(DWORD)分解成两个16位数据(WORD)。

技术图片
1 //对于32位的数据
2 LPARAM lParam;  
3 WORD loValue = LOWORD(lParam);    //取低16位  
4 WORD hiValue = HIWORD(lParam);    //取高16位  
5 
6 对于16位的数据:
7 WORD wValue;  
8 BYTE loValue = LOBYTE(wValue);    //取低8位  
9 BYTE hiValue = HIBYTE(wValue);    //取高8位
View Code

2、数据合成

技术图片
 1 //两个16位数据(WORD)合成32位数据(DWORD,LRESULT,LPARAM,或WPARAM)
 2 
 3 LONG MAKELONG( WORD wLow, WORD wHigh );  
 4 WPARAM MAKEWPARAM( WORD wLow, WORD wHigh );   
 5 LPARAM MAKELPARAM( WORD wLow, WORD wHigh );  
 6 LRESULT MAKELRESULT( WORD wLow, WORD wHigh ); 
 7 
 8 //两个8位的数据(BYTE)合成16位的数据(WORD)
 9 WORD MAKEWORD( BYTE bLow, BYTE bHigh );   
10 
11 //从R(red),G(green),B(blue)三色得到COLORREF类型的颜色值
12 COLORREF RGB( BYTE byRed,BYTE byGreen,BYTE byBlue );
13 
14 //从COLORREF类型的颜色值得到RGB三个颜色值
15 BYTE Red = GetRValue(bkcolor);        //
16 BYTE Green = GetGValue(bkcolor);    //绿  
17 BYTE Blue = GetBValue(bkcolor);      //
View Code

  ANSI 操作函数以str开头 strcpy,Unicode 操作函数以wcs开头 wcscpy。ANSI版本函数结尾以A表示,Unicode版本函数结尾以W表示。
  编写代码时应尽可能使用操作系统函数。有助于提高应用程序的运行性能。

C++数据类型转换

标签:需要   重载   正数   内存   实现   ova   display   赋值   基本   

原文地址:https://www.cnblogs.com/Sheenagh/p/12221826.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!