托管C ++如何将NOT Null终止的const char *转换为String ^

时间:2014-03-25 07:57:47

标签: c++ marshalling managed-c++

在我的Native + Managed代码项目中,我需要将const char *(非空终止)转换为Managed String ^。以下代码在char *正确null终止时运行良好。但是,当char *未终止时,它会返回疯狂的字符串。

String^ STAK::CLRServerProxy::ToCLR(const char* str)
{
    return msclr::interop::marshal_as<String^>(str);    
}

有没有办法我可以要求它将这个本地字符*编组为前5个字符? (这个本地字符串总是5个字符长)

谢谢,

2 个答案:

答案 0 :(得分:2)

String^ STAK::CLRServerProxy::ToCLR(const char* str)
{
    return Marshal::PtrToStringAnsi((IntPtr) (char *) str, 5)
}

或者如果你想让它更灵活

String^ STAK::CLRServerProxy::ToCLR(const char* str, size_t n)
{
    return Marshal::PtrToStringAnsi((IntPtr) (char *) str, n)
}

通过传递5作为第二个参数来调用

答案 1 :(得分:2)

  

我不想创建副本

你必须创建一个副本,System :: String在结构上非常与const char *不同。 Marshal类有一个简单的辅助方法来进行此转换,您可以指定要转换为多少字节,而不需要正确终止的C字符串。一个示例程序:

#include "stdafx.h"

using namespace System;
using namespace System::Diagnostics;
using namespace System::Runtime::InteropServices;

int main(array<System::String ^> ^args)
{
    const char* str = "yada12345garbage...";
    String^ s = Marshal::PtrToStringAnsi(IntPtr((void*)&str[4]), 5);
    Debug::Assert(s == "12345");
    return 0;
}