C++ Cli Convert System String To Std String

3 min read Jul 01, 2024
C++ Cli Convert System String To Std String

Mengonversi System::String ke std::string di C++/CLI

C++/CLI memungkinkan penggunaan keduanya: System::String dari .NET dan std::string dari C++ standar. Terkadang, Anda perlu mengonversi satu ke yang lain. Artikel ini akan memandu Anda dalam mengonversi System::String ke std::string.

Metode 1: Menggunakan Marshal::StringToHGlobalAnsi()

Metode ini menggunakan fungsi Marshal::StringToHGlobalAnsi() untuk mengonversi System::String ke string C-style (berbasis ASCII). Setelah itu, Anda dapat menggunakan std::string(const char)* untuk mengonversi string C-style ke std::string. Berikut contohnya:

#include 
#include 

using namespace System;
using namespace std;

int main() {
  System::String^ str = "Ini adalah string System::String";

  // Mengonversi System::String ke string C-style (ASCII)
  IntPtr ptr = Marshal::StringToHGlobalAnsi(str);
  const char* cstr = static_cast(ptr.ToPointer());

  // Mengonversi string C-style ke std::string
  std::string stdStr(cstr);

  // Membersihkan memori yang dialokasikan
  Marshal::FreeHGlobal(ptr);

  // Mencetak std::string
  cout << stdStr << endl;

  return 0;
}

Metode 2: Menggunakan pin_ptr<> dan marshal_as()

Metode ini memanfaatkan pin_ptr<> untuk menunjuk ke data System::String dan marshal_as<> untuk mengonversi data ke string C-style. Kemudian, Anda dapat menggunakan std::string(const char)* untuk mendapatkan std::string. Berikut contohnya:

#include 
#include 

using namespace System;
using namespace std;

int main() {
  System::String^ str = "Ini adalah string System::String";

  // Mengonversi System::String ke string C-style (ASCII)
  pin_ptr wcharPtr = PtrToStringChars(str);
  string stdStr = marshal_as(wcharPtr);

  // Mencetak std::string
  cout << stdStr << endl;

  return 0;
}

Catatan:

  • Pastikan Anda menyertakan header msclr/marshal_cppstd.h untuk menggunakan fungsi Marshal::StringToHGlobalAnsi(), pin_ptr<>, dan marshal_as<>.
  • Metode pertama menggunakan Marshal::FreeHGlobal() untuk membebaskan memori yang dialokasikan oleh Marshal::StringToHGlobalAnsi().
  • Metode kedua menggunakan PtrToStringChars() untuk mendapatkan pointer ke data System::String yang aman untuk diakses.

Pilih metode yang paling sesuai dengan kebutuhan Anda. Metode pertama mungkin lebih efisien untuk string yang lebih besar, sedangkan metode kedua lebih ringkas dan mudah diterapkan.

Latest Posts