const char * to vector <unsigned char =“”> Initalisation </unsigned>

时间:2012-03-21 06:26:46

标签: c++ visual-c++ vector char initialization

据我所知,使用vector是一种在使用C ++和STL时存储二进制数据的好方法。但是对于我的单元测试,我想使用const char * C字符串变量来初始化向量。

我正在尝试使用此处找到的代码变体 - Converting (void*) to std::vector<unsigned char> - 来执行此操作:

const char* testdata = "the quick brown fox jumps over the lazy dog.";

unsigned char* buffer = (unsigned char*)testdata;
typedef vector<unsigned char> bufferType;

bufferType::size_type size = strlen((const char*)buffer);
bufferType vec(buffer, size);

然而,VC ++编译器对初始化向量的行不满意,说明:

error C2664: 'std::vector<_Ty>::vector(unsigned int,const _Ty &)' : cannot convert parameter 1 from 'char *' to 'unsigned int'

我很欣赏这个问题的极端情况,并为上面的代码做了很多批评:)

提前致谢, 克里斯

4 个答案:

答案 0 :(得分:13)

应该是

bufferType vec(buffer, buffer + size);

bufferType vec(buffer, size);

答案 1 :(得分:3)

std::transform对于此类问题非常有用。您可以使用它一次“转换”一个数据。请参阅此处的文档:

http://www.cplusplus.com/reference/algorithm/transform/

以下代码适用于VS2010。 (我从你的std::string数组创建了一个const char*,但如果你真的想要,你可以避免这种情况。)

#include <algorithm>
#include <vector>

int main(int, char*[])
{
  // Initial test data
  const char* testdata = "the quick brown fox jumps over the lazy dog.";

  // Transform from 'const char*' to 'vector<unsigned char>'
  std::string input(testdata);
  std::vector<unsigned char> output(input.length());
  std::transform(input.begin(), input.end(), output.begin(),
    [](char c)
    {
      return static_cast<unsigned char>(c);
    });

  // Use the transformed data in 'output'...


  return 0;
}

答案 2 :(得分:2)

这对我有用:

// Fetch data into vector
std::vector<char> buffer = <myMethod>.getdata();

// Get a char pointer to the data in the vector
char* buf = buffer.data();

// cast from char pointer to unsigned char pointer
unsigned char* membuf = reinterpret_cast<unsigned char*>(buf);            

// now convert to vector<unsigned char> buffer
std::vector<unsigned char> vec(membuf, membuf + buffer.size()); 

// display vector<unsigned char>   
CUtils::<myMethodToShowDataBlock>(vec);      

答案 3 :(得分:0)

你打算做的事情似乎是这样的:

buffertype vec(testdata, next(testdata, strlen(testdata)));

不需要中间buffer变量。从charunsigned char的转换将隐式发生。

请注意,这不会从'\0'获取终止testdata字符。因此,如果您希望能够执行以下操作:cout << vec.data(),您将无法做到。如果您希望这样做:buffertype vec(testdata, next(testdata, strlen(testdata) + 1))或者您可能只想考虑:

basic_string<unsigned char> vec(testdata, next(testdata, strlen(testdata)));

这将保留隐藏的'\0'。由于这不是string您无法做到的,cout << veccout << vec.data()会有效。我已经创建了Live Example中的每一个。