2012-03-21 19 views
8

Capisco che l'utilizzo di vector è un buon modo per memorizzare dati binari quando si utilizza C++ e STL. Tuttavia, per i miei test unitari, vorrei inizializzare il vettore usando una variabile stringa const char * C.const char * per vettore <unsigned char> Initalisation

Sto tentando di utilizzare una variante del codice trovato qui - Converting (void*) to std::vector<unsigned char> - per fare questo:

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

Tuttavia il VC++ compilatore non è felice con la linea di inizializzazione del vettore, affermando:

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

apprezzo l'estrema n00bity di questa domanda e sono pienamente preparati per molte critiche sul codice di cui sopra :)

Grazie in anticipo, Chris

+1

Tu sei molto meglio usare: 'std :: vector vec;' ' vec.push_back (" la volpe marrone rapido si sposta oltre i pigri dog. ");' –

+0

Il codice in prova verrà infine utilizzato per gestire i dati binari, quindi la preferenza per il vettore . Per i test, vorrei inizializzarlo usando i dati const char *. –

+0

È possibile ottenere i dati di carattere sottostanti semplicemente usando 'std :: string :: c_str()', e si risparmiano molti potenziali problemi nell'utilizzo di puntatori non elaborati. –

risposta

11

Dovrebbe essere

bufferType vec(buffer, buffer + size); 

non

+0

Ovviamente dovrei dormire di più :) Molte grazie! –

3

std::transform è utile proprio per questo tipo di problema. Puoi usarlo per "trasformare" un pezzo di dati alla volta. Vedere la documentazione qui:

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

Il seguente codice funziona in VS2010. (Ho creato un std::string dal const char* array, ma probabilmente si potrebbe evitare che se si voleva davvero.)

#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

cosa che si voleva fare sembra essere qualcosa di simile:

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

C'è nessuna necessità per la variabile intermedia buffer. La conversione da char a unsigned char avverrà implicitamente.

Si noti che questo non accetta il carattere di terminazione '\0' da testdata. Quindi se volessi essere in grado di fare qualcosa del tipo: cout << vec.data() non saresti in grado di farlo. Se si vuole che si potrebbe fare: buffertype vec(testdata, next(testdata, strlen(testdata) + 1)) o si può solo prendere in considerazione di fare:

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

che manterrà un nascosto '\0'. Perché questo non è un non sarà in grado di fare, cout << vec ma cout << vec.data() funzionerà. Ho creato uno Live Example di ciascuno di questi.

+0

Non vedo come potrebbe funzionare se si utilizzano buffer binari di grandi dimensioni come testdata – serup

+0

@serup L'OP dice: "Mi piacerebbe inizializzare il' vector' usando una variabile stringa C const const * '. Sto dimostrando come farlo. Si noti che possiamo usare solo un 'char *' per rappresentare una stringa a causa del carattere di terminazione: ''\ 0'' Un carattere di terminazione è inappropriato per i dati binari, quindi la dimensione dovrebbe essere mantenuta separatamente dal' char * '. In questa situazione avresti bisogno di sostituire 'strlen (testdata)' nella mia risposta con la dimensione data. –

1

Ecco cosa ha funzionato per me:

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