亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? visual c++ net中的字符串轉(zhuǎn)換方法 .txt

?? 我在畢業(yè)設(shè)計(jì)過程中涉及到socket編程
?? TXT
字號:
Visual C++.NET中的字符串轉(zhuǎn)換方法 
 

  Visual C++.NET涉及到ATL/ATL Server、MFC和托管C++等多種編程方式,不僅功能強(qiáng)大而且應(yīng)用廣泛。在編程中,我們常常會遇到ANSI、Unicode以及BSTR不同編碼類型的字符串轉(zhuǎn)換操作。本文先介紹基本字符串類型,然后說明相關(guān)的類,如CComBSTR、_bstr_t、CStringT等,最后討論它們的轉(zhuǎn)換方法,其中還包括使用最新ATL7.0的轉(zhuǎn)換類和宏,如CA2CT、CA2TEX等。

  一、BSTR、LPSTR和LPWSTR

  在Visual C++.NET的所有編程方式中,我們常常要用到這樣的一些基本字符串類型,如BSTR、LPSTR和LPWSTR等。之所以出現(xiàn)類似上述的這些數(shù)據(jù)類型,是因?yàn)椴煌幊陶Z言之間的數(shù)據(jù)交換以及對ANSI、Unicode和多字節(jié)字符集(MBCS)的支持。

  那么什么是BSTR、LPSTR以及LPWSTR呢?

  BSTR(Basic STRing,Basic字符串)是一個(gè)OLECHAR*類型的Unicode字符串。它被描述成一個(gè)與自動化相兼容的類型。由于操作系統(tǒng)提供相應(yīng)的API函數(shù)(如SysAllocString)來管理它以及一些默認(rèn)的調(diào)度代碼,因此BSTR實(shí)際上就是一個(gè)COM字符串,但它卻在自動化技術(shù)以外的多種場合下得到廣泛使用。圖1描述了BSTR的結(jié)構(gòu),其中DWORD值是字符串中實(shí)際所占用的字節(jié)數(shù),且它的值是字符串中Unicode字符的兩倍。

  LPSTR和LPWSTR是Win32和VC++所使用的一種字符串?dāng)?shù)據(jù)類型。LPSTR被定義成是一個(gè)指向以NULL(‘\0’)結(jié)尾的8位ANSI字符數(shù)組指針,而LPWSTR是一個(gè)指向以NULL結(jié)尾的16位雙字節(jié)字符數(shù)組指針。在VC++中,還有類似的字符串類型,如LPTSTR、LPCTSTR等,它們的含義如圖2所示。

  例如,LPCTSTR是指“l(fā)ong pointer to a constant generic string”,表示“一個(gè)指向一般字符串常量的長指針類型”,與C/C++的const char*相映射,而LPTSTR映射為 char*。

  一般地,還有下列類型定義:

#ifdef UNICODE 
 typedef LPWSTR LPTSTR;
 typedef LPCWSTR LPCTSTR; 
#else 
 typedef LPSTR LPTSTR; 
 typedef LPCSTR LPCTSTR; 
#endif  

  二、CString、CStringA 和 CStringW

  Visual C++.NET中將CStringT作為ATL和MFC的共享的“一般”字符串類,它有CString、CStringA和CStringW三種形式,分別操作不同字符類型的字符串。這些字符類型是TCHAR、char和wchar_t。TCHAR在Unicode平臺中等同于WCHAR(16位Unicode字符),在ANSI中等價(jià)于char。wchar_t通常定義為unsigned short。由于CString在MFC應(yīng)用程序中經(jīng)常用到,這里不再重復(fù)。

  三、VARIANT、COleVariant 和_variant_t

  在OLE、ActiveX和COM中,VARIANT數(shù)據(jù)類型提供了一種非常有效的機(jī)制,由于它既包含了數(shù)據(jù)本身,也包含了數(shù)據(jù)的類型,因而它可以實(shí)現(xiàn)各種不同的自動化數(shù)據(jù)的傳輸。下面讓我們來看看OAIDL.H文件中VARIANT定義的一個(gè)簡化版:

struct tagVARIANT {
 VARTYPE vt;
 union {
  short iVal; // VT_I2.
  long lVal; // VT_I4.
  float fltVal; // VT_R4.
  double dblVal; // VT_R8.
  DATE date; // VT_DATE.
  BSTR bstrVal; // VT_BSTR.
  …
  short * piVal; // VT_BYREF|VT_I2.
  long * plVal; // VT_BYREF|VT_I4.
  float * pfltVal; // VT_BYREF|VT_R4.
  double * pdblVal; // VT_BYREF|VT_R8.
  DATE * pdate; // VT_BYREF|VT_DATE.
  BSTR * pbstrVal; // VT_BYREF|VT_BSTR.
 };
}; 

  顯然,VARIANT類型是一個(gè)C結(jié)構(gòu),它包含了一個(gè)類型成員vt、一些保留字節(jié)以及一個(gè)大的union類型。例如,如果vt為VT_I2,那么我們可以從iVal中讀出VARIANT的值。同樣,當(dāng)給一個(gè)VARIANT變量賦值時(shí),也要先指明其類型。例如:

VARIANT va;
:: VariantInit(&va); // 初始化
int a = 2002;
va.vt = VT_I4; // 指明long數(shù)據(jù)類型
va.lVal = a; // 賦值 

  為了方便處理VARIANT類型的變量,Windows還提供了這樣一些非常有用的函數(shù):

  VariantInit —— 將變量初始化為VT_EMPTY;

  VariantClear —— 消除并初始化VARIANT;

  VariantChangeType —— 改變VARIANT的類型;

  VariantCopy —— 釋放與目標(biāo)VARIANT相連的內(nèi)存并復(fù)制源VARIANT。

  COleVariant類是對VARIANT結(jié)構(gòu)的封裝。它的構(gòu)造函數(shù)具有極為強(qiáng)大大的功能,當(dāng)對象構(gòu)造時(shí)首先調(diào)用VariantInit進(jìn)行初始化,然后根據(jù)參數(shù)中的標(biāo)準(zhǔn)類型調(diào)用相應(yīng)的構(gòu)造函數(shù),并使用VariantCopy進(jìn)行轉(zhuǎn)換賦值操作,當(dāng)VARIANT對象不在有效范圍時(shí),它的析構(gòu)函數(shù)就會被自動調(diào)用,由于析構(gòu)函數(shù)調(diào)用了VariantClear,因而相應(yīng)的內(nèi)存就會被自動清除。除此之外,COleVariant的賦值操作符在與VARIANT類型轉(zhuǎn)換中為我們提供極大的方便。例如下面的代碼:

COleVariant v1("This is a test"); // 直接構(gòu)造
COleVariant v2 = "This is a test"; 
// 結(jié)果是VT_BSTR類型,值為"This is a test"
COleVariant v3((long)2002);
COleVariant v4 = (long)2002;
// 結(jié)果是VT_I4類型,值為2002 

  _variant_t是一個(gè)用于COM的VARIANT類,它的功能與COleVariant相似。不過在Visual C++.NET的MFC應(yīng)用程序中使用時(shí)需要在代碼文件前面添加下列兩句:

  #include "comutil.h"

  #pragma comment( lib, "comsupp.lib" )
 
四、CComBSTR和_bstr_t

  CComBSTR是對BSTR數(shù)據(jù)類型封裝的一個(gè)ATL類,它的操作比較方便。例如:

CComBSTR bstr1; 
bstr1 = "Bye"; // 直接賦值
OLECHAR* str = OLESTR("ta ta"); // 長度為5的寬字符
CComBSTR bstr2(wcslen(str)); // 定義長度為5
wcscpy(bstr2.m_str, str); // 將寬字符串復(fù)制到BSTR中
CComBSTR bstr3(5, OLESTR("Hello World")); 
CComBSTR bstr4(5, "Hello World"); 
CComBSTR bstr5(OLESTR("Hey there")); 
CComBSTR bstr6("Hey there"); 
CComBSTR bstr7(bstr6); 
// 構(gòu)造時(shí)復(fù)制,內(nèi)容為"Hey there" 

  _bstr_t是是C++對BSTR的封裝,它的構(gòu)造和析構(gòu)函數(shù)分別調(diào)用SysAllocString和SysFreeString函數(shù),其他操作是借用BSTR API函數(shù)。與_variant_t相似,使用時(shí)也要添加comutil.h和comsupp.lib。

  五、BSTR、char*和CString轉(zhuǎn)換

  (1) char*轉(zhuǎn)換成CString

  若將char*轉(zhuǎn)換成CString,除了直接賦值外,還可使用CString::Format進(jìn)行。例如:

char chArray[] = "This is a test";
char * p = "This is a test"; 

  或

LPSTR p = "This is a test"; 

  或在已定義Unicode應(yīng)的用程序中

TCHAR * p = _T("This is a test"); 

  或

LPTSTR p = _T("This is a test");
CString theString = chArray;
theString.Format(_T("%s"), chArray);
theString = p; 

  (2) CString轉(zhuǎn)換成char*

  若將CString類轉(zhuǎn)換成char*(LPSTR)類型,常常使用下列三種方法:

  方法一,使用強(qiáng)制轉(zhuǎn)換。例如:

CString theString( "This is a test" );
LPTSTR lpsz =(LPTSTR)(LPCTSTR)theString;  

  方法二,使用strcpy。例如:

CString theString( "This is a test" );
LPTSTR lpsz = new TCHAR[theString.GetLength()+1];
_tcscpy(lpsz, theString); 

  需要說明的是,strcpy(或可移值Unicode/MBCS的_tcscpy)的第二個(gè)參數(shù)是 const wchar_t* (Unicode)或const char* (ANSI),系統(tǒng)編譯器將會自動對其進(jìn)行轉(zhuǎn)換。

  方法三,使用CString::GetBuffer。例如:

CString s(_T("This is a test "));
LPTSTR p = s.GetBuffer();
// 在這里添加使用p的代碼
if(p != NULL) *p = _T('\0');
s.ReleaseBuffer(); 
// 使用完后及時(shí)釋放,以便能使用其它的CString成員函數(shù) 

  (3) BSTR轉(zhuǎn)換成char*

  方法一,使用ConvertBSTRToString。例如:

#include 
#pragma comment(lib, "comsupp.lib")
int _tmain(int argc, _TCHAR* argv[]){
BSTR bstrText = ::SysAllocString(L"Test");
char* lpszText2 = _com_util::ConvertBSTRToString(bstrText);
SysFreeString(bstrText); // 用完釋放
delete[] lpszText2;
return 0;
}  

  方法二,使用_bstr_t的賦值運(yùn)算符重載。例如:

_bstr_t b = bstrText;
char* lpszText2 = b; 

  (4) char*轉(zhuǎn)換成BSTR

  方法一,使用SysAllocString等API函數(shù)。例如:

BSTR bstrText = ::SysAllocString(L"Test");
BSTR bstrText = ::SysAllocStringLen(L"Test",4);
BSTR bstrText = ::SysAllocStringByteLen("Test",4); 

  方法二,使用COleVariant或_variant_t。例如:

//COleVariant strVar("This is a test");
_variant_t strVar("This is a test");
BSTR bstrText = strVar.bstrVal; 

  方法三,使用_bstr_t,這是一種最簡單的方法。例如:

BSTR bstrText = _bstr_t("This is a test"); 

  方法四,使用CComBSTR。例如:

BSTR bstrText = CComBSTR("This is a test"); 

  或

CComBSTR bstr("This is a test");
BSTR bstrText = bstr.m_str; 

  方法五,使用ConvertStringToBSTR。例如:

char* lpszText = "Test";
BSTR bstrText = _com_util::ConvertStringToBSTR(lpszText); 

  (5) CString轉(zhuǎn)換成BSTR

  通常是通過使用CStringT::AllocSysString來實(shí)現(xiàn)。例如:

CString str("This is a test");
BSTR bstrText = str.AllocSysString();
SysFreeString(bstrText); // 用完釋放  

  (6) BSTR轉(zhuǎn)換成CString

  一般可按下列方法進(jìn)行:

BSTR bstrText = ::SysAllocString(L"Test");
CStringA str;
str.Empty();
str = bstrText;  

  或

CStringA str(bstrText); 

  (7) ANSI、Unicode和寬字符之間的轉(zhuǎn)換

  方法一,使用MultiByteToWideChar將ANSI字符轉(zhuǎn)換成Unicode字符,使用WideCharToMultiByte將Unicode字符轉(zhuǎn)換成ANSI字符。

  方法二,使用“_T”將ANSI轉(zhuǎn)換成“一般”類型字符串,使用“L”將ANSI轉(zhuǎn)換成Unicode,而在托管C++環(huán)境中還可使用S將ANSI字符串轉(zhuǎn)換成String*對象。例如:

TCHAR tstr[] = _T("this is a test");
wchar_t wszStr[] = L"This is a test";
String* str = S”This is a test”; 

  方法三,使用ATL 7.0的轉(zhuǎn)換宏和類。ATL7.0在原有3.0基礎(chǔ)上完善和增加了許多字符串轉(zhuǎn)換宏以及提供相應(yīng)的類,它具有如圖3所示的統(tǒng)一形式:

  其中,第一個(gè)C表示“類”,以便于ATL 3.0宏相區(qū)別,第二個(gè)C表示常量,2表示“to”,EX表示要開辟一定大小的緩沖。SourceType和DestinationType可以是A、T、W和OLE,其含義分別是ANSI、Unicode、“一般”類型和OLE字符串。例如,CA2CT就是將ANSI轉(zhuǎn)換成一般類型的字符串常量。下面是一些示例代碼:

LPTSTR tstr= CA2TEX<16>("this is a test");
LPCTSTR tcstr= CA2CT("this is a test");
wchar_t wszStr[] = L"This is a test";
char* chstr = CW2A(wszStr);  

  六、結(jié)語

  幾乎所有的程序都要用到字符串,而Visual C++.NET由于功能強(qiáng)大、應(yīng)用廣泛,因而字符串之間的轉(zhuǎn)換更為頻繁。本文幾乎涉及到目前的所有轉(zhuǎn)換方法。當(dāng)然對于.NET框架來說,還可使用Convert和Text類進(jìn)行不同數(shù)據(jù)類型以及字符編碼之間的相互轉(zhuǎn)換。

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美激情中文不卡| 日韩免费福利电影在线观看| 国产亚洲综合av| youjizz国产精品| 青青草97国产精品免费观看无弹窗版| 久久久无码精品亚洲日韩按摩| 在线亚洲+欧美+日本专区| 国产乱码精品一区二区三区五月婷| 一区二区三区美女视频| 国产亚洲精品超碰| 制服丝袜在线91| 一本一道波多野结衣一区二区| 国内国产精品久久| 亚洲成av人片在www色猫咪| 国产精品久久久久天堂| 久久亚洲捆绑美女| 欧美一个色资源| 精品视频免费看| 91视频在线看| 成人小视频在线观看| 久久99精品久久久久久动态图| 亚洲18影院在线观看| 亚洲精品视频观看| 中文字幕一区二区三区在线播放 | 粉嫩一区二区三区性色av| 一区二区三区 在线观看视频| 久久久久久99久久久精品网站| 欧美一区二区大片| 欧美精品一二三四| 欧洲国内综合视频| 91视频在线观看| 91在线小视频| 99久久精品免费看| www.激情成人| 91在线看国产| 99久久精品免费| av资源网一区| 不卡电影一区二区三区| 成人av免费网站| av在线免费不卡| 91色porny在线视频| 波多野结衣视频一区| 成人av电影免费在线播放| 成人一区二区三区| 99这里只有精品| www.一区二区| 91色九色蝌蚪| 欧美日韩一区二区电影| 欧美精品久久天天躁| 国产精品毛片久久久久久久| 久久久久久久国产精品影院| 久久久99免费| 国产精品久久看| 亚洲欧美一区二区三区久本道91| 国产精品久久久久久久久久久免费看 | 日韩免费在线观看| 久久久国产精品午夜一区ai换脸| 欧美激情在线一区二区| 中文字幕一区二区三区不卡 | 午夜精品久久久久影视| 丝袜国产日韩另类美女| 免费成人av资源网| 国产一区二区美女| www.久久久久久久久| 欧美三级日韩三级国产三级| 欧美一级久久久久久久大片| 久久噜噜亚洲综合| 亚洲女同一区二区| 天天爽夜夜爽夜夜爽精品视频 | 色综合激情五月| 91精品免费在线| 久久蜜臀中文字幕| 一区二区激情小说| 美国十次综合导航| 成人黄色a**站在线观看| 在线观看成人小视频| 日韩精品专区在线| 国产精品青草综合久久久久99| 亚洲在线观看免费| 韩国女主播成人在线| 色综合天天综合狠狠| 日韩一区二区三区电影 | 亚洲综合激情网| 毛片不卡一区二区| 不卡av电影在线播放| 欧美高清视频不卡网| 国产欧美一区二区精品性| 一区二区三区在线视频播放| 久久精品国产久精国产| 色婷婷综合久久久中文一区二区 | 亚洲乱码国产乱码精品精可以看| 日本不卡一区二区| 成人黄色在线看| 日韩精品一区二区三区在线观看 | 国产精品免费久久| 午夜私人影院久久久久| 成人免费va视频| 日韩一区二区在线免费观看| 成人欧美一区二区三区在线播放| 久久精品国产**网站演员| 91麻豆自制传媒国产之光| 精品乱人伦小说| 亚洲地区一二三色| 91在线视频网址| 久久综合给合久久狠狠狠97色69| 亚洲国产aⅴ天堂久久| 成人aaaa免费全部观看| 欧美本精品男人aⅴ天堂| 亚洲国产欧美在线人成| eeuss影院一区二区三区| 日韩精品中文字幕在线不卡尤物| 亚洲国产成人av网| 91日韩在线专区| 国产调教视频一区| 国产美女在线精品| 欧美一区二区三区四区在线观看| 亚洲午夜av在线| 日本精品一区二区三区四区的功能| 国产日韩欧美制服另类| 久草中文综合在线| 91精品国产手机| 丝袜诱惑制服诱惑色一区在线观看| 色哟哟精品一区| 亚洲少妇中出一区| 成人一级视频在线观看| 国产日韩一级二级三级| 国产成人午夜精品影院观看视频 | 成人黄色av网站在线| 亚洲精品一区在线观看| 麻豆91精品91久久久的内涵| 欧美另类久久久品| 五月激情六月综合| 欧美日韩大陆在线| 午夜成人免费电影| 在线播放91灌醉迷j高跟美女| 亚洲自拍偷拍综合| 欧美主播一区二区三区| 又紧又大又爽精品一区二区| 色www精品视频在线观看| 一区二区三区在线不卡| 色婷婷国产精品综合在线观看| 亚洲三级免费观看| 色综合久久久网| 亚洲永久免费av| 9191精品国产综合久久久久久| 性久久久久久久久| 日韩视频一区二区在线观看| 久久国产精品免费| 国产欧美在线观看一区| 91丨九色丨尤物| 一区二区三区四区激情| 欧美日韩在线播放三区四区| 日韩电影在线看| 久久久av毛片精品| 99久久综合国产精品| 亚洲自拍偷拍综合| 欧美一个色资源| 福利视频网站一区二区三区| 亚洲欧美欧美一区二区三区| 欧美性感一区二区三区| 日韩 欧美一区二区三区| 久久九九久精品国产免费直播| 北岛玲一区二区三区四区| 一区二区三区不卡在线观看| 欧美色倩网站大全免费| 亚洲韩国精品一区| 91精品国产一区二区三区香蕉| 日本免费在线视频不卡一不卡二| 欧美一级艳片视频免费观看| 久久精品99久久久| 国产精品福利电影一区二区三区四区| hitomi一区二区三区精品| 一区二区成人在线视频| 亚洲精品中文在线| 制服丝袜中文字幕亚洲| 国产自产高清不卡| 国产精品高潮久久久久无| 成人手机电影网| 五月激情六月综合| 久久久五月婷婷| 91视频com| 美国十次综合导航| 中文在线免费一区三区高中清不卡| 成人爱爱电影网址| 午夜视频在线观看一区二区三区 | 日韩亚洲欧美在线| 91丝袜美腿高跟国产极品老师 | 亚洲成人av一区二区| 精品久久久久久最新网址| 成人一道本在线| 亚洲国产综合人成综合网站| 制服丝袜国产精品| 成人永久看片免费视频天堂| 一区二区三区欧美久久| 国产亚洲欧洲997久久综合 | 中文字幕中文字幕在线一区| 欧美色视频在线| 国产高清成人在线| 亚洲国产裸拍裸体视频在线观看乱了| 精品少妇一区二区三区在线视频|