2009-02-02 25 views
15

Sto lavorando a un progetto non gestito in C++.Ottieni byte da std :: string in C++

Ho bisogno di sapere come posso prendere una stringa come questa "alcuni dati per cifrare" e ottenere un array di byte [] che userò come fonte per Encrypt.

In C# lo faccio

for (int i = 0; i < text.Length; i++) 
    buffer[i] = (byte)text[i]; 

Che cosa ho bisogno di sapere è come fare lo stesso, ma utilizzando non gestito C++.

Grazie!

+0

ovviamente si tratta di C++. Ho corretto gli errori di battitura –

+0

sì, hai ragione, grazie – Vic

risposta

24

Se avete solo bisogno di accesso in sola lettura, quindi c_str() lo farà:

char const *c = myString.c_str(); 

Se avete bisogno di accesso in lettura/scrittura, quindi è possibile copiare la stringa in un vettore. i vettori gestiscono la memoria dinamica per te. Non dovete fare confusione con l'allocazione/deallocazione poi:

std::vector<char> bytes(myString.begin(), myString.end()); 
bytes.push_back('\0'); 
char *c = &bytes[0]; 
+1

Se vuole un array di byte, ha bisogno di terminare '\ 0'? In tal caso è possibile utilizzare data() solo per lettura. –

+0

non ero sicuro di aver bisogno di \ 0 o meno. Se non lo fa, ora sa che può usare .data(). grazie per aver commentato, Martin. –

+1

Questa risposta sembra corretta e potrebbe funzionare ma presumere che l'archivio dati per un vettore di char sia contiguo e che non cambierà è pericoloso. – Mark

1

Da uno std :: string è possibile utilizzare il metodo c_ptr() se si vuole arrivare al puntatore del buffer char_t.

Sembra che vogliate copiare i caratteri della stringa in un nuovo buffer. Vorrei semplicemente usare la funzione std::string::copy:

length = str.copy(buffer, str.size()); 
+0

Alcune implementazioni di std :: string possono utilizzare il conteggio dei riferimenti, quindi una copia non necessariamente produrrebbe nuovi byte che sarebbero sicuri da sovrascrivere. –

0

Se questo è solo plain vanilla C, quindi:

strcpy(buffer, text.c_str()); 

Supponendo che di buffer viene allocato e abbastanza grande da contenere il contenuto del 'testo', che è l'ipotesi nel tuo codice originale.

Se cifrare() prende un 'const char *' quindi è possibile utilizzare

encrypt(text.c_str()) 

e non è necessario copiare la stringa.

3

Normalmente, le funzioni di crittografia prendere

encrypt(const void *ptr, size_t bufferSize); 

come argomenti. Puoi passare c_str e lunghezza direttamente:

encrypt(strng.c_str(), strng.length()); 

In questo modo, lo spazio extra viene assegnato o sprecato.

+0

Se si passa un puntatore e una lunghezza, si dovrebbe utilizzare data() anziché c_str() per indicare che non viene utilizzato come stringa. –

18

std::string::data sembra essere sufficiente e più efficiente. Se si desidera avere una memoria non-const per manipolare (strano per la crittografia) è possibile copiare i dati in un buffer utilizzando memcpy:

unsigned char buffer[mystring.length()]; 
memcpy(buffer, mystring.data(), mystring.length()); 

fanboy STL incoraggio a utilizzare std::copy invece:

std::copy(mystring.begin(), mystring.end(), buffer); 

ma non c'è davvero molto di positivo. Se è necessaria la terminazione nullo, utilizzare std::string::c_str() e le varie tecniche di duplicazione delle stringhe fornite da altri utenti, ma in genere lo evito e faccio una query per lo length.In particolare con la crittografia si sa solo che qualcuno cercherà di romperlo spingendo i valori null in esso, e usando std::string::data() si scoraggia dal fare pigramente ipotesi sui bit sottostanti nella stringa.

1

Se hai solo bisogno di leggere i dati.

encrypt(str.data(),str.size()); 

Se è necessaria una copia di lettura/scrittura dei dati, inserirla in un vettore. (Don; t allocare dinamicamente lo spazio che è il lavoro del vettore).

std::vector<byte> source(str.begin(),str.end()); 
encrypt(&source[0],source.size()); 

Ovviamente stiamo tutti partendo dal presupposto che byte è un carattere !!!

-6

Non penso che vogliate usare il codice C# che avete lì. Essi forniscono System.Text.Encoding.ASCII (UTF anche *)

string str = "some text; 
byte[] bytes = System.Text.Encoding.ASCII.GetBytes(str); 

vostri problemi derivano dall'ignorare la codifica in C# non è il tuo codice C++

Problemi correlati