2012-03-21 176 views
8

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

我试图用这里找到的代码的变种 - 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' 

我明白这个问题的极端n00bity和我上面:)

由于提前,0上的代码很多批评做好充分准备克里斯

+1

你好得多使用: '的std ::矢量 VEC;'' vec.push_back(“敏捷的棕色狐狸跳过懒惰狗“。);' – 2012-03-21 06:43:48

+0

被测试的代码最终将用于处理二进制数据,因此,优先选择vector 。对于测试,我想用const char * data来初始化它。 – 2012-03-21 07:10:07

+0

你可以简单地通过'std :: string :: c_str()'获得底层字符数据,并且可以节省很多使用原始指针的潜在问题。不是一个不好的交易IMO。 – 2012-03-21 07:12:19

回答

11

应该

bufferType vec(buffer, buffer + size); 

+0

我显然应该多睡一会儿:)非常感谢! – 2012-03-21 07:14:00

3

std::transform是只是这类问题非常有用。您可以使用它一次“变换”一个数据。在这里看到的文档:

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

下面的代码在VS2010。 (我从你的const char*阵列创建std::string,但你可能会避免,如果你真的想。)

#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; 
} 
0

你打算做什么,似乎是这样的:

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

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

请注意,这不会从testdata获取终止的'\0'字符。所以,如果你想能够做到这样的事情: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

+0

如果你使用大的二进制缓冲区作为测试数据,我不明白这是如何工作的 – serup 2017-01-04 08:18:22

+0

@serup OP说:“我想使用'const char *'C字符串变量初始化'vector'。我正在演示如何做到这一点。请注意,我们只能使用'char *'来表示字符串,因为终止字符:''\ 0''终止字符对二进制数据不适用,所以size必须与'char * '。在这种情况下,您需要用给定的大小替换我的答案中的'strlen(testdata)'。 – 2017-01-04 14:25:42

1

这里是我工作:

// 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);