Правильный способ конвертировать массив ^ в std :: string - PullRequest
0 голосов
/ 28 мая 2020

Я хотел знать, как правильно преобразовать управляемый array<unsigned char>^ в неуправляемый std::string. Что я делаю прямо сейчас:

array<unsigned char>^ const content = GetArray();
auto enc = System::Text::Encoding::ASCII;
auto const source = enc->GetString(content);
std::string s = msclr::interop::marshal_as<std::string>(source);

Есть ли способ за один шаг упорядочить content в std::string без преобразования в String^?

I попробовал:

array<unsigned char>^ const content = GetArray();
std::string s = msclr::interop::marshal_as<std::string>(content);

, но это дало мне следующие ошибки:

Error   C4996   'msclr::interop::error_reporting_helper<_To_Type,cli::array<unsigned char,1> ^,false>::marshal_as': 
This conversion is not supported by the library or the header file needed for this conversion is not included.  
Please refer to the documentation on 'How to: Extend the Marshaling Library' for adding your own marshaling method.

Error   C2065   '_This_conversion_is_not_supported': undeclared identifier  

1 Ответ

2 голосов
/ 28 мая 2020

Если массив состоит из простых байтов, то он уже закодирован в ASCII (или любых других узких символах, которые вы используете). Преобразование в управляемый UTF-16 String^ - ненужный обходной путь.

Просто создайте строку с узкими символами из массива байтов. Передайте указатель на первый байт и длину.

array<unsigned char>^ const content = GetArray();
pin_ptr<unsigned char> contentPtr = &content[0];
std::string s(contentPtr, content->Length);

Я сейчас не на компиляторе, могут быть тривиальные синтаксические ошибки.

...