将ATL :: CString转换为std :: vector <unsigned char =“”> </unsigned>

时间:2014-12-21 22:21:48

标签: c++ atl

这是一个功能。

inline void Str2Data(std::vector<unsigned char> &To, const CString &From)
{
    To.resize(From.GetLength() * sizeof(TCHAR) );

    if (!From.IsEmpty())
        memcpy(&To[0], From.GetString(), To.size());  
}

它转换为ok,但如果From =&#34; 123&#34;,To = {&#39; 1&#39;,&#39; 0&#39;,&#39; 2&#39;, &#39; 0&#39;,&#39; 3&#39;}。

为什么会这样?

1 个答案:

答案 0 :(得分:2)

您平台上的TCHAR可能是wchar_t,因此是两个字节,因此CString实际上是宽字符的容器。你想要的是进行转换而不是按字节复制:

inline void Str2Data(std::vector<unsigned char> &To, const CString &From)
{
    if (!From.IsEmpty()) {
        To.resize(From.GetLength());
        std::transform(From.GetString(), 
                       From.GetString() + From.GetLength(),
                       To.begin(),
                       [](TCHAR c) { return static_cast<unsigned char>(c); });
    }
    else {
        To.clear();
    }
}