2013-07-31 14 views
11

Ho un puntatore a un vettore di tipo uint8.Converti vettore di uint8 in stringa

Come prendere questo puntatore e convertire i dati nel vettore in una stringa completa rappresentativa del suo contenuto?

+0

Si dovrebbe già sapere la lunghezza dal vettore -> size(). Ha dati non ascii al suo interno o no? – Duck

+0

Sono tutti dati ascii. –

risposta

17

Si potrebbe semplicemente inizializzare il std::string con la sequenza ottenuta dalla std::vector<uint8_t>:

std::string str(v->begin(), v->end()); 

Non v'è alcuna necessità di giocare qualsiasi trucchi verificare se il std::vector<uint8_t> è vuota: se lo è, la gamma sarà essere vuoto Tuttavia, potresti voler controllare se il puntatore è v è nullo. Quanto sopra richiede che punti ad un oggetto valido.

+0

Va bene se chiedo perché sei stato via così tanto tempo? – 0x499602D2

+3

@ 0x499602D2: Vuoi dire, perché non ho risposto alle domande per un po '? È semplice: ero impegnato a cercare di far funzionare il lavoro oltre al lavoro. In questo momento sono impegnato al lavoro per lavorare oltre al lavoro. –

+0

Sono sorpreso che questa risposta sia accettata perché non produce qualcosa di "rappresentativo del suo contenuto". Se il vettore è "{1,2,3,4,5,6,7,8,9}", il risultato sarà una stringa di caratteri non visualizzabili! –

0
vector<uint8_t> *p; 
string str(
    p && !p->empty() ? &*p->begin()    : NULL, 
    p && !p->empty() ? &*p->begin() + p->size() : NULL); 
+0

Non è necessario eseguire alcun trucco con i vettori 'empty()': restituiranno un intervallo valido e 'std :: string' ha un costruttore che accetta una coppia di iteratori di input. –

+0

@ DietmarKühl: Oh sì, hai ragione, ho l'abitudine di farlo perché a volte compilo con una vecchia implementazione STL che non ha questo sovraccarico basato su modelli, completamente dimenticato. – Mehrdad

+0

sì, la vecchia implementazione RogueWave è ancora disponibile come libreria standard C++ predefinita per Sun Studio, suppongo. Se dovessi usarlo, userei effettivamente 'std :: copy (v-> begin(), v-> end(), std :: back_inserter (str));'. –

2

Per chi vuole la conversione essere fatto dopo viene dichiarata una stringa, è possibile utilizzare std :: string :: assegnare(), ad esempio:

std::string str; 
std::vector<uint8_t> v; 
str.assign(v.begin(), v.end());