使用 memcpy 将矢量数据复制到 wstring 的正确方法

Proper way to use memcpy for copying vector data to wstring

我有一个原始数据: 47 00 61 00 6D 00 65 00 41 00 73 00 73 00 65 00 74 00 = G.a.m.e.A.s.s.e.t。 它存储在 vector<char> 数组的第 15 位。

现在我想将它复制到 wstring 值,但我得到“3221225477”错误代码。

这是我写的代码:

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

它对我的所有其他值都起作用,只是 wstring 不起作用。

如果我使用 wcout << string_Data << endl; 它不会崩溃但会打印 3 of ? , 它在控制台中显示 GameAsset???

如果我使用 wcout << string_Data.c_str() << endl; 它会崩溃。

我做错了什么?使用 memcpy 的正确方法是什么???

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() 方法:

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 不是很便携。它仅在 Windows 上是 16 位的,其中 wchar_t 使用 UTF-16 处理。如果您需要此代码在其他平台上工作,其中 wchar_t 是使用 UTF-32 处理的,那么您应该使用 char16_t 解释 vector 数据并将其复制到 std::u16string,或使用 std::wstring_convert 或您选择的任何 Unicode 库(ICU 等)将其转换为 std::wstring