如何将wstring转换为字节向量

时间:2013-08-20 12:33:33

标签: c++ type-conversion byte wstring

您好我有几个typedef:

typedef unsigned char Byte;
typedef std::vector<Byte> ByteVector;
typedef std::wstring String;

我需要将String转换为ByteVector,我试过这个:

String str = L"123";
ByteVector vect(str.begin(), str.end());

结果vectror包含3个元素:1,2,3。但它是wstring所以这个字符串中的每个字符都很宽,所以我的预期结果是:0,1,0, 2,0,3。

有没有任何标准的方法可以做到这一点,或者我需要编写一些自定义函数。

2 个答案:

答案 0 :(得分:4)

Byte const* p = reinterpret_cast<Byte const*>(&str[0]);
std::size_t size = str.size() * sizeof(str.front());
ByteVector vect(p, p+size);

答案 1 :(得分:2)

你的实际目标是什么?如果你只是想获得代表wchar_t对象的字节,那么一个相当简单的转换就可以实现这个技巧,尽管我不会仅使用强制转换来unsigned char const*而是使用显式转换。

另一方面,如果您确实想要将std::wstring转换为使用例如编码的序列。 UTF8或UTF16通常是在处理字符时的情况,用于编码的转换变得明显更复杂。转换为编码的最简单方法可能是使用C wcstombs()

std::vector<char> target(source.size() * 4);
size_t n = wcstombs(&target[0], &source[0], target.size());

上述片段假设source不为空且wchar_t中的最后sourcewchar_t()。转换使用C的全局语言环境,并假定转换在那里设置的任何字符编码。还有一个版本wcstombs_l(),您可以在其中指定区域设置。

C ++具有类似的功能,但在std::codecvt<...>方面使用起来有点困难。如有必要,我可以提供一个例子。