2012-03-21 181 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);