2014-03-25 3 views
1

내 Native + Managed 코드 프로젝트에서 const char * (null이 아닌 경우)를 Managed String ^으로 변환해야합니다. 다음 코드는 char *가 null로 끝나는 경우 잘 작동합니다. 그러나 char *가 null로 끝나지 않으면 미친 문자열을 반환합니다.Managed C++ NOT Null로 끝나는 const char *를 문자열로 변환^

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

이 원시 char *를 마샬링하도록 요청할 수있는 방법은 처음 5 문자입니까? (긴이 기본 문자열은 항상 5 개 문자)

+1

소스가 [6] [5] –

+0

@Dieter 나는 소스를 변경할 수없는 소스에서 제로가 숯불합니다. 타사 서버에서 전송됩니다. – Waseem

+1

이상, char 버퍼 [6], strncpy 및 버퍼 [5] = 0 –

답변

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

감사하거나 2 PARAM로 (5)를 전달하여

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

콜링 더 유연하게하려면

+0

나는 str의 또 다른 복사본을 만드는 것을 피하려고 노력 중이다. 이것은 내가가는 마지막 선택 일 것입니다. – Waseem

+0

@Chris - std :: string을 피하기 위해 답변을 업데이트했습니다. – user93353

+0

고맙습니다. user93353 – Waseem

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; 
} 
는 소스 문자열을 변경
관련 문제