На этом шаге мы приведем программу, реализующую указанное преобразование.
Текст программы приведен ниже, а результат - на рисунке 1.
// 219_1.cpp: главный файл проекта. #include "stdafx.h" #include <string.h> //for strlen() using namespace System; using namespace System::Runtime::InteropServices; void main() { char buf[] = "Native String"; int len = strlen(buf); //длина строки array< Byte >^ byteArray = gcnew array< Byte >(len + 2); // копирование символов char с преобразованием указателя // на них во внутренний указатель на них в управляемой куче. // Преобразование идет в обычном С-стиле: Marshal::Copy((IntPtr)buf, byteArray, 0, len); // вывод (для проверки преобразования) элементов массива // с использованием методов класса array: for ( int i = byteArray->GetLowerBound(0); i <= byteArray->GetUpperBound(0); i++ ) { // byteArray->GetValue(i) выдает указатель на объект а. // Объектами являются элементы массива типа Byte. // Поэтому идет преобразование типа. Но внутренний // указатель в управляемой куче обладает свойствами // обычного C++ указателя, поэтому можно применить // операцию разыменования (*), чтобы получить // обычный символ: char dc = *(Byte^) byteArray->GetValue(i); // Преобразование (Char) обычного символа в Юникод-символ, // чтобы воспользоваться выводом из класса Console: Console::Write((Char)dc); } // выдает стандартный символ окончания строки в стандартный // выходной поток: Console::WriteLine(); Console::ReadLine(); }
Рис.1. Результат преобразования строки обычных символов в managed-массив
На следующем шаге мы рассмотрим преобразование System::String в wchar_t* или char*.