使用 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
。
我有一个原始数据:
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
。