none
请问如何将托管的System::String ^转换成非托管的char *? RRS feed

答案

  • 用Marshal::Copy函数。

    你是要把托管的String转变成非托管的ascii string (char*)呢,还是 wchar_t* ?

    若是转变成前者,可以这么做:

    String^ str1 = L"Hello World";
    Encoding^ encoding = Encoding::ASCII;

    array<Byte>^ bytes = encoding->GetBytes(str);
    int len = bytes->Length;

    char* str2 = new char[len + 1];

    IntPtr pstr2(str2);
    Marshal::Copy(bytes, 0, pstr2, len);
    str2[len] = '\0';

    若是转变成wchar_t*,更简单了。直接获取String类的指针,复制就是。

    String^ str1 = L"Hello World";
    wchar_t* str2 = new wchar_t[str1->Length + 1];

    pin_ptr<const wchar_t> wch = PtrToStringChars(str1);
    memcpy(str2, wch, (str1->Length + 1) * sizeof(wchar_t));



    MCPD (Windows & Web)
    2009年5月5日 3:59

全部回复

  • 用Marshal::Copy函数。

    你是要把托管的String转变成非托管的ascii string (char*)呢,还是 wchar_t* ?

    若是转变成前者,可以这么做:

    String^ str1 = L"Hello World";
    Encoding^ encoding = Encoding::ASCII;

    array<Byte>^ bytes = encoding->GetBytes(str);
    int len = bytes->Length;

    char* str2 = new char[len + 1];

    IntPtr pstr2(str2);
    Marshal::Copy(bytes, 0, pstr2, len);
    str2[len] = '\0';

    若是转变成wchar_t*,更简单了。直接获取String类的指针,复制就是。

    String^ str1 = L"Hello World";
    wchar_t* str2 = new wchar_t[str1->Length + 1];

    pin_ptr<const wchar_t> wch = PtrToStringChars(str1);
    memcpy(str2, wch, (str1->Length + 1) * sizeof(wchar_t));



    MCPD (Windows & Web)
    2009年5月5日 3:59
  • 非常感谢

    2009年5月5日 6:46