Правильный способ использовать memcpy для копирования векторных данных в wstring - PullRequest
0 голосов
/ 12 января 2020

У меня есть необработанные данные: 47 00 61 00 6D 00 65 00 41 00 73 00 73 00 65 00 74 00 = GameAsset, и он хранится в позиции 15 в массиве vector<char>.

Теперь я хочу скопировать его в значение wstring , но Я получаю код ошибки «3221225477».

Вот код, который я написал:

wstring                             string_Data;
std::memcpy(&string_Data, &file_buffer.data()[15], 18);

он работает на всех моих других значениях, просто wstring не работает.

Если я использую wcout << string_Data << endl;, он не обрабатывает sh, а печатает значение с 3 из? , В консоли показывается GameAsset???.

И если я использую wcout << string_Data.c_str() << endl;, это вызовет sh.

Что я делаю не так? Как правильно сделать это с помощью memcpy ???

1 Ответ

4 голосов
/ 12 января 2020

std::wstring содержит указатель на символьные данные, которые хранятся в другом месте в памяти. Но вы не выделяете эту память, на которую она может указывать, чтобы скопировать данные вашего персонажа. Вы копируете символьные данные непосредственно на сам wstring, повреждая его внутреннюю часть и, вероятно, окружающую память.

Попробуйте вместо этого:

wstring string_Data;
string_Data.resize(9);
std::memcpy(&string_Data[0], file_buffer.data()+15, 18);
// or:
// std::copy(reinterpret_cast<wchar_t*>(file_buffer.data()+15), reinterpret_cast<wchar_t*>(file_buffer.data()+33), string_Data.begin());

В качестве альтернативы, вы можете использовать std::wstring::assign() method:

wstring string_Data;
string_Data.assign(reinterpret_cast<wchar_t*>(file_buffer.data()+15), 9);

Или конструктор std::wstring:

wstring string_Data(reinterpret_cast<wchar_t*>(file_buffer.data()+15), 9);

В любом случае, просто обратите внимание, что wchar_t не очень переносим. Это 16 бит только на Windows, где wchar_t обрабатывается с использованием UTF-16. Если вам нужен этот код для работы на других платформах, где вместо wchar_t используется UTF-32, вам следует интерпретировать данные vector с помощью char16_t и скопировать их в std::u16string или преобразовать в std::wstring с использованием std::wstring_convert или любой другой библиотеки Unicode по вашему выбору (ICU, et c).

...