【问题标题】:Proper way to use memcpy for copying vector data to wstring使用 memcpy 将矢量数据复制到 wstring 的正确方法
【发布时间】:2020-01-12 00:40:34
【问题描述】:

我有一个原始数据: 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 的正确方法是什么???

【问题讨论】:

  • 为什么必须将数据复制到 wstring 中才能使用?如果你需要字符串形式的字符串,那为什么首先要放在向量中呢?
  • @MichaelKenzel 好问题!这是因为我使用自己的序列化和反序列化器制作了一个自定义二进制文件,我使用 zlib 解压缩为 chars 向量,然后将二进制数据读取为其值。

标签: c++ memcpy wstring


【解决方案1】:

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,或将其转换为@ 987654334@ 使用 std::wstring_convert 或您选择的任何 Unicode 库(ICU 等)。

【讨论】:

  • 谢谢 Remy,这是一个很好解释的答案,但我无法让你的代码工作,我在 memcpy 使用 string_Data.data() 时收到 argument of type "const wchar_t *" is incompatible with parameter of type "void *" 错误...你忘记了什么吗?
  • 我知道它可以通过使用(void*)string_Data.data() 来修复它并且它可以工作,但是为什么你没有在你的代码中使用它?
  • @J.Mcgill 我的错,我一直忘记 non-const data() 直到 C++17 才被添加。我已经更新了我的答案。
  • 谢谢!只需添加,std::wmemcpy 也可以完成工作!
猜你喜欢
  • 2012-07-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-02
相关资源
最近更新 更多