2012-03-21 27 views
8

Rozumiem, że używanie wektora jest dobrym sposobem przechowywania danych binarnych przy użyciu C++ i STL. Jednak w przypadku moich testów jednostkowych chciałbym zainicjować wektor za pomocą zmiennej łańcuchowej const char * C.const char * na wektor <unsigned char> Inicjalizacja

Ja próbuje użyć wariant kodu znaleźć tutaj - Converting (void*) to std::vector<unsigned char> - aby to zrobić:

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

Jednak VC++ kompilator nie jest zadowolony z linii Inicjalizacja wektor, stwierdzając:

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

doceniam ekstremalną n00bity to pytanie i jestem w pełni przygotowany na wiele krytyki na powyższym kodzie :)

góry dzięki, Chris

+1

Jesteś znacznie lepiej wyłączyć za pomocą: 'std :: vector vec;' 'vec.push_back (" Szybki brązowy lis przeskoczył nad leniwym pies. ");' –

+0

Testowany kod zostanie ostatecznie użyty do obsługi danych binarnych, stąd preferencja dla wektora . Do testów chciałbym zainicjować go za pomocą danych const char *. –

+0

Możesz uzyskać podstawowe dane char po prostu używając 'std :: string :: c_str()', a zaoszczędzisz wiele potencjalnych problemów związanych z używaniem surowych wskaźników. Nie jest to zła oferta IMO. –

Odpowiedz

11

Powinno być

bufferType vec(buffer, buffer + size); 

nie

+0

Wyraźnie powinienem dostać więcej snu :) Wielkie dzięki! –

3

std::transform jest przydatna tylko dla tego rodzaju problemu. Możesz go użyć do "przekształcenia" jednego fragmentu danych na raz. Zobacz dokumentację tutaj:

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

Poniższy kod działa w VS2010. (I stworzył std::string z tablicy const char*, ale prawdopodobnie można by było uniknąć, jeśli naprawdę chce.)

#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

Co pan zamierza zrobić wydaje się być coś takiego:

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

Jest nie ma potrzeby stosowania zmiennej pośredniej buffer. Konwersja z char na unsigned char nastąpi niejawnie.

Należy zauważyć, że nie jest to znak końca o numerze '\0' z z testdata. Więc jeśli chcesz móc zrobić coś takiego: cout << vec.data(), nie będziesz w stanie. Jeśli chcesz, że można zrobić: buffertype vec(testdata, next(testdata, strlen(testdata) + 1)) lub może po prostu rozważyć robi:

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

Które zachowania ukryty '\0'. Ponieważ nie jest to string, nie będzie można tego zrobić, cout << vec, ale zadziała cout << vec.data(). Stworzyłem Live Example każdego z nich.

+0

Nie widzę, jak to mogłoby działać, jeśli używasz dużych buforów binarnych jako testdata. – serup

+0

@serup OP mówi: "Chciałbym zainicjować' wektor' używając zmiennej łańcuchowej 'const char *' C. " Demonstruję, jak to zrobić. Zauważ, że możemy używać tylko 'char * 'do reprezentowania ciągu znaków z powodu znaku kończącego:' \ 0'' Znak kończący jest jednak nieodpowiedni dla danych binarnych, więc rozmiar musiałby być utrzymywany oddzielnie od 'char * '. W tej sytuacji musisz zastąpić 'strlen (testdata)' w mojej odpowiedzi z podanym rozmiarem. –

1

Oto co pracował dla mnie:

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