2022年字符串转换借鉴 .pdf

上传人:C****o 文档编号:34257741 上传时间:2022-08-15 格式:PDF 页数:6 大小:54.23KB
返回 下载 相关 举报
2022年字符串转换借鉴 .pdf_第1页
第1页 / 共6页
2022年字符串转换借鉴 .pdf_第2页
第2页 / 共6页
点击查看更多>>
资源描述

《2022年字符串转换借鉴 .pdf》由会员分享,可在线阅读,更多相关《2022年字符串转换借鉴 .pdf(6页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、字符串转换_BSTR/LPSTR/LPWSTR/Char 一、BSTR 、LPSTR 和 LPWSTR 在 Visual C+.NET 的所有编程方式中,我们常常要用到这样的一些基本字符串类型,如BSTR 、LPSTR 和 LPWSTR 等。之所以出现类似上述的这些数据类型,是因为不同编程语言之间的数据交换以及对 ANSI 、Unicode 和多字节字符集 (MBCS) 的支持。那么什么是 BSTR 、LPSTR 以及 LPWSTR 呢?BSTR(Basic STRing,Basic 字符串 )是一个 OLECHAR*类型的 Unicode 字符串。它被描述成一个与自动化相兼容的类型。 由于操

2、作系统提供相应的API 函数(如 SysAllocString)来管理它以及一些默认的调度代码, 因此 BSTR 实际上就是一个 COM 字符串,但它却在自动化技术以外的多种场合下得到广泛使用。图 1 描述了 BSTR 的结构,其中 DWORD值是字符串中实际所占用的字节数,且它的值是字符串中Unicode 字符的两倍。LPSTR 和 LPWSTR 是 Win32和 VC+ 所使用的一种字符串数据类型。LPSTR 被定义成是一个指向以NULL( 0)结尾的 8 位 ANSI字符数组指针,而LPWSTR 是一个指向以 NULL结尾的 16 位双字节字符数组指针。在 VC+ 中,还有类似的字符串类

3、型,如LPTSTR 、LPCTSTR 等,它们的含义如图2 所示。例如, LPCTSTR 是指“long pointer to a constant generic string”,表示“一个指向一般字符串常量的长指针类型”,与C/C+的 const char*相映射,而 LPTSTR 映射为 char* 。一般地,还有下列类型定义:#ifdef UNICODE typedef LPWSTR LPTSTR; typedef LPCWSTR LPCTSTR; #else typedef LPSTR LPTSTR; typedef LPCSTR LPCTSTR; #endif 二、CString

4、、CStringA 和 CStringW Visual C+.NET 中将 CStringT 作为 ATL和 MFC 的共享的“一般”字符串类,它有CString 、CStringA 和 CStringW 三种形式,分别操作不同字符类型的字符串。这些字符类型是TCHAR 、char 和wchar_t 。 TCHAR 在 Unicode 平台中等同于 WCHAR(16 位 Unicode 字符) , 在 ANSI中等价于 char 。 wchar_t通常定义为 unsigned short。由于 CString 在 MFC 应用程序中经常用到,这里不再重复。三、VARIANT 、COleVari

5、ant 和_variant_t 在 OLE 、ActiveX 和 COM 中,VARIANT 数据类型提供了一种非常有效的机制,由于它既包含了数据本身,也包含了数据的类型,因而它可以实现各种不同的自动化数据的传输。下面让我们来看看OAIDL.H文件中 VARIANT 定义的一个简化版:struct tagVARIANT VARTYPE vt; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 6 页 - - - - - - - - - union short iVal; /

6、 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 *

7、 pbstrVal; / VT_BYREF|VT_BSTR. ; ; 显然,VARIANT 类型是一个 C结构,它包含了一个类型成员vt 、一些保留字节以及一个大的union类型。例如,如果 vt 为 VT_I2,那么我们可以从 iVal 中读出 VARIANT 的值。同样,当给一个VARIANT变量赋值时,也要先指明其类型。例如:VARIANT va; : VariantInit(&va); / 初始化int a = 2002; va.vt = VT_I4; / 指明 long 数据类型va.lVal = a; / 赋值为了方便处理 VARIANT 类型的变量, Windows还提供了这样一

8、些非常有用的函数:VariantInit 将变量初始化为 VT_EMPTY;VariantClear 消除并初始化 VARIANT ;VariantChangeType 改变 VARIANT 的类型;VariantCopy 释放与目标 VARIANT 相连的内存并复制源VARIANT 。COleVariant 类是对 VARIANT 结构的封装。它的构造函数具有极为强大大的功能,当对象构造时首先调用 VariantInit进行初始化,然后根据参数中的标准类型调用相应的构造函数,并使用VariantCopy 进行转换赋值操作,当VARIANT 对象不在有效范围时,它的析构函数就会被自动调用,由于

9、析构函数调用了VariantClear,因而相应的内存就会被自动清除。除此之外,COleVariant 的赋值操作符在与 VARIANT 类型转换中为我们提供极大的方便。例如下面的代码:COleVariant v1(This is a test); / 直接构造COleVariant v2 = This is a test; / 结果是 VT_BSTR 类型,值为 This is a test COleVariant v3(long)2002); COleVariant v4 = (long)2002; / 结果是 VT_I4 类型,值为 2002 名师资料总结 - - -精品资料欢迎下载 -

10、 - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 6 页 - - - - - - - - - _variant_t是一个用于 COM 的 VARIANT 类, 它的功能与 COleVariant 相似。 不过在 Visual C+.NET的 MFC 应用程序中使用时需要在代码文件前面添加下列两句:#include comutil.h #pragma comment( lib, comsupp.lib ) 四、CComBSTR和_bstr_t CComBSTR是对 BSTR 数据类型封装的一个ATL类,它的操作比较方便

11、。例如:CComBSTR bstr1; bstr1 = Bye; / 直接赋值OLECHAR* str = OLESTR(ta ta); / 长度为 5 的宽字符CComBSTR bstr2(wcslen(str); / 定义长度为 5 wcscpy(bstr2.m_str, str); / 将宽字符串复制到BSTR 中CComBSTR bstr3(5, OLESTR(Hello World); CComBSTR bstr4(5, Hello World); CComBSTR bstr5(OLESTR(Hey there); CComBSTR bstr6(Hey there); CComBST

12、R bstr7(bstr6); / 构造时复制,内容为 Hey there _bstr_t是是 C+ 对 BSTR 的封装, 它的构造和析构函数分别调用SysAllocString和 SysFreeString函数, 其他操作是借用 BSTR API 函数。 与_variant_t相似, 使用时也要添加 comutil.h和 comsupp.lib 。五、BSTR 、char* 和 CString 转换(1) char*转换成 CString 若将 char* 转换成 CString ,除了直接赋值外,还可使用CString:Format进行。例如:char chArray = This is

13、 a test; char * p = This is a test; 或LPSTR p = This is a test; 或在已定义 Unicode 应的用程序中TCHAR * p = _T(This is a test); 或LPTSTR p = _T(This is a test); CString theString = chArray; theString.Format(_T(%s), chArray); theString = p; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - -

14、- - 第 3 页,共 6 页 - - - - - - - - - (2) CString转换成 char* 若将 CString 类转换成 char*(LPSTR) 类型,常常使用下列三种方法:方法一,使用强制转换。例如:CString theString( This is a test ); LPTSTR lpsz =(LPTSTR)(LPCTSTR)theString; 方法二,使用 strcpy 。例如:CString theString( This is a test ); LPTSTR lpsz = new TCHARtheString.GetLength()+1; _tcscpy

15、(lpsz, theString); 需要说明的是, strcpy( 或可移值 Unicode/MBCS的_tcscpy) 的第二个参数是 const wchar_t* (Unicode) 或 const char* (ANSI),系统编译器将会自动对其进行转换。方法三,使用 CString:GetBuffer。例如:CString s(_T(This is a test ); LPTSTR p = s.GetBuffer(); / 在这里添加使用p 的代码if(p != NULL) *p = _T(0); s.ReleaseBuffer(); / 使用完后及时释放,以便能使用其它的CStri

16、ng 成员函数(3) BSTR 转换成 char* 方法一,使用 ConvertBSTRToString 。例如:#include comutil.h #pragma comment(lib, comsupp.lib) int _tmain(int argc, _TCHAR* argv) BSTR bstrText = :SysAllocString(LTest); char* lpszText2 = _com_util:ConvertBSTRToString(bstrText); SysFreeString(bstrText); / 用完释放delete lpszText2; return

17、0; 方法二,使用 _bstr_t的赋值运算符重载。例如:_bstr_t b = bstrText; char* lpszText2 = b; (4) char*转换成 BSTR 方法一,使用 SysAllocString等 API 函数。例如:名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 6 页 - - - - - - - - - BSTR bstrText = :SysAllocString(LTest); BSTR bstrText = :SysAllocStri

18、ngLen(LTest,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 bst

19、rText = 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转换成 BSTR 通常是通过使用 CStringT:AllocSysString来实现。例如:CString str(This is a test); BSTR bst

20、rText = str.AllocSysString(); ,SysFreeString(bstrText); / 用完释放(6) BSTR 转换成 CString 一般可按下列方法进行:BSTR bstrText = :SysAllocString(LTest); CStringA str; str.Empty(); str = bstrText; 或CStringA str(bstrText); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 6 页 - - - -

21、- - - - - (7) ANSI 、Unicode 和宽字符之间的转换方法一, 使用 MultiByteToWideChar 将 ANSI字符转换成 Unicode 字符, 使用 WideCharToMultiByte将 Unicode 字符转换成 ANSI字符。方法二,使用“ _T”将 ANSI转换成“一般”类型字符串,使用“L”将 ANSI转换成 Unicode,而在托管 C+ 环境中还可使用 S将 ANSI字符串转换成 String* 对象。例如:TCHAR tstr = _T(this is a test); wchar_t wszStr = LThis is a test; St

22、ri ng* str = S”This is a test”;方法三,使用 ATL 7.0 的转换宏和类。 ATL7.0 在原有 3.0 基础上完善和增加了许多字符串转换宏以及提供相应的类,它具有如图3 所示的统一形式:其中,第一个 C表示“类”,以便于ATL 3.0 宏相区别,第二个C表示常量, 2 表示“to ”, EX表示要开辟一定大小的缓冲。SourceType 和 DestinationType可以是 A、T、W和 OLE ,其含义分别是ANSI、Unicode、“一般”类型和OLE字符串。例如, CA2CT 就是将 ANSI转换成一般类型的字符串常量。下面是一些示例代码:LPTSTR tstr= CA2TEX(this is a test); LPCTSTR tcstr= CA2CT(this is a test); wchar_t wszStr = LThis is a test; char* chstr = CW2A(wszStr); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 6 页 - - - - - - - - -

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 高考资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁