如何将 unsigned char[] 转换为 std::vector<unsigned char>

Posted

技术标签:

【中文标题】如何将 unsigned char[] 转换为 std::vector<unsigned char>【英文标题】:How to convert unsigned char[] to std::vector<unsigned char> 【发布时间】:2015-01-14 20:09:23 【问题描述】:

我正在尝试将其传递给我的项目的另一个需要它是向量的部分

unsigned char vch[65];

unsigned int size() const  return GetLen(vch[0]); 
const unsigned char* begin() const  return vch; 
const unsigned char* end() const  return vch + size(); 


std::vector<unsigned char> Raw() const

        return (vch, vch + size());

我得到了错误

 could not convert '(const unsigned char*)(&((const CPubKey*)this)-
CPubKey::vch)' from 'const unsigned char*' to 'std::vector<unsigned char*>'

【问题讨论】:

std::vector 有一个带有一对迭代器的构造函数。用那个。你很接近。 错误信息是 std::vector&lt;unsigned char*&gt; - 注意 * ,可能你在你的一个原型中错误地写了这个 * 有一个错字:end() 缺少结尾 为什么不直接使用字符串呢?不就是一种矢量吗? 【参考方案1】:
return (vch, vch + size());

这使用逗号运算符 - 长话短说,写

return std::vector<unsigned char>(vch, vch + size());

std::vector<unsigned char> vec(vch, vch + size())
return vec;

相反。 (后者在语义上是等价的,但在可读性方面更可取) 或者使用 C++11:

return vch, vch + size();

这确实有效,因为带有指针的花括号初始化列表无法转换为initializer_list&lt;unsigned char&gt;。 [over.match.list]/1:

当非聚合类类型T 的对象被列表初始化时 8.5.4 规定重载决议是根据 根据本节中的规则,重载决议选择 构造函数分两个阶段:

最初,候选函数是类 T [..] 的初始化列表构造函数 (8.5.4) [..]

如果找不到可行的初始化列表构造函数,则再次执行重载决议,其中 候选函数是类T的所有构造函数,参数列表由元素组成 初始化列表。

现在,是否有可行的初始化列表构造函数? [over.ics.list]:

    否则,如果参数类型为std::initializer_list&lt;X&gt; 并且初始化器列表的所有元素都可以隐式转换 致X,[..]

10. 除以上列举的情况外,在所有情况下,都不可能进行转换。

显然没有从unsigned char*unsigned char 的隐式转换,因此选择了迭代器对构造函数模板。 Demo.

【讨论】:

即使是,也行不通。 std::initializer_list 很贪心。请注意,c++ 默认情况下表示所有版本。如果你想要特定版本的东西,那么他们应该添加一个标签,比如c++03。 @Rapptz 添加了标准引号和演示,以明确它的工作原理。 :) 我自己建议 std::vector&lt;unsigned char&gt; Raw() const std::vector&lt;unsigned char&gt; retval(vch, vch + size()); return retval; 使用 C++03。成本(NRVO 和 RVO 都消除了副本)保持不变,但我们不会在一条线上不必要地做两件事。但这可能是个人喜好问题。 @Yakk 你说得对。介意我将其纳入我的答案吗? @Columbo 为什么我还要添加评论? :)【参考方案2】:

它可能不会直接回答答案。

但问题是当你可以使用std::stringstd::basic_string&lt;unsigned char&gt;而不是std::vector时,为什么还要使用vector,像这样:

unsigned char a[]="1234";
std::basic_string<unsigned char> v=a;

【讨论】:

为什么你认为basic_string&lt;unsigned char&gt;vector 更好?

以上是关于如何将 unsigned char[] 转换为 std::vector<unsigned char>的主要内容,如果未能解决你的问题,请参考以下文章

如何将 unsigned char* 转换为 unsigned long long int?

怎样把unsigned short 转换为 unsigned char

将 char* 转换为 unsigned char*

如何使用 Swig 将 unsigned char* 转换为 Python 列表?

将 System::String^ 转换为 unsigned char*

如何从 const char* 转换为 unsigned int c++