如何将 const wchar_t* 转换为 System::String?

Posted

技术标签:

【中文标题】如何将 const wchar_t* 转换为 System::String?【英文标题】:How do i convert const wchar_t* to System::String? 【发布时间】:2013-03-19 18:08:57 【问题描述】:

我需要将我的 SHA1 (wchar_t*) 转换为普通的 String^ 以便在某个函数中使用它。有任何想法吗?我尝试了谷歌,但所有结果都与我的问题完全相反。 :\

注意:我正在使用 C++.NET 框架和 Windows 窗体应用程序

【问题讨论】:

@Dan 发生错误。错误 2 错误 C2664: 'System::String::String(const wchar_t *)' : 无法将参数 1 从 'std::string' 转换为 'const wchar_t *' c:\users\jeremy\documents\visual studio 2010\项目\启动器\启动器\Form1.h 289 可能有点晚了,但是存储在 10 个 wchar_t 对象 a) 中的原始 SHA1 哈希很可能不是有效的 Unicode(无效字符,无效代理); b) 有千分之一的机会包含嵌入的 NULL(这意味着仅使用 gcnew 将截断)。如果 OP 是从十六进制表示转换,那不是问题。 【参考方案1】:

使用构造函数;像这样:

const wchar_t* const pStr1 = ...;
System::String^ const str1 = gcnew System::String(pStr1);

const char* const pStr2 = ...;
System::String^ const str2 = gcnew System::String(pStr2);

如果您使用标准 C++ 字符串类(std::wstringstd::string),则可以使用 c_str() 方法获取指针。那么你的代码可能是

const std::wstring const std_str1 = ...;
System::String^ const str1 = gcnew System::String(std_str1.c_str());

见System.String 和广泛讨论here。

【讨论】:

【参考方案2】:

如果在执行 Dan 的解决方案时收到错误 cannot convert parameter 1 from 'std::string' to 'const wchar_t *',那么您问错了问题。与其问如何将wchar_t* 转换为String^,不如问如何将std::string 转换为String^

使用内置的c_str 函数从std::string 中获取一个普通的char*,并将其传递给构造函数。

std::string unmanaged = ...;
String^ managed = gcnew String(unmanaged.c_str());

【讨论】:

【参考方案3】:

你也可以试试:

#include <msclr\marshal_cppstd.h>

...

String^ managedString = msclr::interop::marshal_as<String^>(/* std::string or wchar_t * or const wchar_t * */);

您可以参考Overview of Marshaling in C++ 了解您可以使用的所有支持类型

【讨论】:

以上是关于如何将 const wchar_t* 转换为 System::String?的主要内容,如果未能解决你的问题,请参考以下文章

char* 到 const wchar_t * 的转换

我想将 std::string 转换为 const wchar_t *

我想将std :: string转换为const wchar_t *

错误 C2440:“默认参数”:无法从“const wchar_t [1]”转换为“BSTR”

不推荐从字符串 const 转换。到 wchar_t*

C++CString转换为const char *类型