2009-05-07 6 views
26

Sto scrivendo un'applicazione C++ e mi chiedevo quale fosse il modo convenzionale in C++ di memorizzare un array di byte in memoria.E ++ equivalente a stringa di STL per dati binari

C'è qualcosa di simile a una stringa, fatta eccezione per i dati binari.

In questo momento sto usando un array * char senza segno * per memorizzare i dati, ma qualcosa di più simile a STL/C++ sarebbe meglio.

+0

Duplicato di http://stackoverflow.com/questions/441203/proper-way-to-store-binary-data-with-c-stl –

risposta

35

Vorrei usare std::vector<unsigned char>. La maggior parte delle operazioni necessarie possono essere eseguite utilizzando l'STL con intervalli di iteratore. Inoltre, ricorda che se hai davvero bisogno dei dati grezzi, &v[0] è garantito per dare un puntatore alla matrice sottostante.

+3

Non c'è bisogno di fare affidamento su '& v [0]' quando 'v.data()' è più chiaro. –

+3

@LimitedAtonement Effettivamente, tuttavia, nel 2009 'data()' non era definito su 'std :: vector'. –

23

È possibile utilizzare std::string anche per dati binari. La lunghezza dei dati in std::string viene memorizzata in modo esplicito e non determinata dalla terminazione nulla, pertanto i byte null non hanno un significato speciale in uno std::string.

std::string è spesso più conveniente di std::vector<char> perché fornisce molti metodi utili per lavorare con dati binari ma non forniti da vector. Per analizzare/creare dati binari è utile avere a disposizione substr(), sovraccarichi per + e std::stringstream. Sui vettori gli algoritmi da <algorithm> possono essere utilizzati per ottenere gli stessi effetti, ma è più maldestro dei metodi di stringa. Se si agisce solo su "sequenze di caratteri", std::string fornisce i metodi che si desidera, anche se queste sequenze contengono dati "binari".

+5

o std :: vector lothar

+0

Vorrei utilizzare anche std :: vector . – xian

+1

std :: vector ha il vantaggio che si può ottenere il suo contenuto come un puntatore/scrivibile/char (di & vec [0]). D'altra parte, non si ottiene l'ottimizzazione copy-on-write comune nelle implementazioni std :: string. – bdonlan

19

È necessario utilizzare std::vector<unsigned char> o std::vector<uint8_t> (se si dispone di un'intestazione moderna stdint.h). Non c'è niente di sbagliato nell'usare unsigned char[] o uint8_t[] se stai lavorando con buffer di dimensioni fisse. Dove std::vector brilla davvero quando è necessario aumentare o aggiungere frequentemente i buffer. Gli iteratori di STL hanno la stessa semantica dei puntatori, quindi gli algoritmi STL funzioneranno altrettanto bene con std::vector e con semplici vecchi array.

E come indicato da CAdaker, l'espressione &v[0] garantisce il puntatore sottostante al buffer del vettore (ed è garantito che sia un blocco di memoria contigua). Questa garanzia è stata aggiunta in un addendum allo standard C++.

Personalmente, eviterei di usare std::string per manipolare buffer di byte arbitrari, poiché penso che sia potenzialmente confuso, ma non è una pratica inaudita.