托管c++如何将非空终止的const char *转换为String ^

Managed C++ how to convert NOT Null terminated const char * to String ^

本文关键字:char const 转换 String 终止 c++ 托管      更新时间:2023-10-16

在我的本机+托管代码项目中,我需要将const char *(非null终止)转换为托管字符串^。当char *正确地以null结尾时,下面的代码运行良好。但是,当char *不是null结束时,它返回疯狂字符串。

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

是否有一种方法可以要求它将这个本机char *仅封送到前5个字符?(这个本地字符串总是5个字符长)

谢谢你,

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作为第二个参数来调用

我宁愿不创建一个副本

你必须创建一个副本,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;
}