2009-02-02 10 views
15

Estoy trabajando en un proyecto no administrado de C++.Obtenga bytes de std :: string en C++

Necesito saber cómo puedo tomar una cadena como esta "algunos datos para cifrar" y obtener una matriz de bytes [] que voy a utilizar como fuente para cifrar.

En C# hago

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

Lo que necesito saber es cómo hacer lo mismo pero usando C++ no administrado.

Gracias!

+0

obviamente esto es sobre C++. He corregido los errores tipográficos –

+0

Sí, tienes razón, gracias – Vic

Respuesta

24

Si sólo necesita acceso de sólo lectura, entonces c_str() lo hará:

char const *c = myString.c_str(); 

Si necesita acceso de lectura/escritura, a continuación, puede copiar la cadena en un vector. vectores gestionan memoria dinámica para usted. Usted no tiene que meterse con la asignación/desasignación a continuación:

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

Si él quiere una matriz de bytes, ¿necesita la terminación '\ 0'? En ese caso, puede usar data() solo para lectura. –

+0

no estaba seguro de si necesita el \ 0 o no. Si no lo hace, ahora sabe que puede usar .data(). gracias por comentar sobre eso, Martin. –

+1

Esta respuesta parece correcta y puede funcionar, pero suponiendo que el almacén de datos para un vector de char es contiguo y no cambiará es peligroso. – Mark

1

De un std :: string puede utilizar el método c_ptr() si desea obtener en el puntero de memoria intermedia char_t.

Parece que solo quiere copiar los caracteres de la cadena en un nuevo búfer. Yo simplemente uso la función std::string::copy:

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

Algunas implementaciones de std :: string pueden usar el recuento de referencias, por lo que una copia no daría necesariamente como resultado nuevos bytes que serían seguros para escribir. –

0

Si esto es simplemente la vainilla C, entonces:

strcpy(buffer, text.c_str()); 

Suponiendo que el buffer se ha asignado y lo suficientemente grande como para mantener el contenido de 'texto', que es la suposición en tu código original.

Si cifrar() realiza un 'const char *', entonces se puede utilizar

encrypt(text.c_str()) 

y no es necesario copiar la cadena.

3

Normalmente, las funciones de cifrado tomar

encrypt(const void *ptr, size_t bufferSize); 

como argumentos. Puede pasar c_str y length directamente:

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

De esta manera, se asigna o se desperdicia espacio adicional.

+0

Si está pasando un puntero y una longitud, entonces debe usar data() en lugar de c_str() para indicar que no se está utilizando como una cadena. –

18

std::string::data parece ser suficiente y más eficiente. Si usted quiere tener la memoria no constante para manipular (extraño para el cifrado) puede copiar los datos en un buffer usando memcpy:

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

fanboys STL animo a utilizar std::copy lugar:

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

pero realmente no hay mucho de un lado a esto. Si necesita una terminación nula, use std::string::c_str() y las diversas técnicas de duplicación de cadenas que otros han proporcionado, pero generalmente evitaría eso y solo consultaría el length.Particularmente con la criptografía, usted sabe que alguien va a tratar de romperla introduciéndole nulos, y usar std::string::data() lo desanima de hacer suposiciones sobre los bits subyacentes de la cadena.

1

Si solo necesita leer los datos.

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

Si necesita una copia de lectura/escritura de los datos, colóquela en un vector. (Don; t asignar dinámicamente el espacio que es el trabajo del vector).

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

Por supuesto, todos estamos asumiendo que byte es un char !!!

-6

No creo que quiera usar el código C# que tiene allí. Proporcionan System.Text.Encoding.ASCII (también UTF *)

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

sus problemas se derivan de ignorar la codificación en C# no su código C++

Cuestiones relacionadas