elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Tutorial básico de Quickjs


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Pasar de char* a string pérdida de datos
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 Ir Abajo Respuesta Imprimir
Autor Tema: Pasar de char* a string pérdida de datos  (Leído 4,214 veces)
Kaxperday


Desconectado Desconectado

Mensajes: 702


The man in the Middle


Ver Perfil WWW
Pasar de char* a string pérdida de datos
« en: 6 Noviembre 2015, 11:01 am »

Si char* tiene un caracter nulo en mitad de la secuencia al construir la string se corta allí:

Código
  1. char *e = "aisjiajisfj\0buenas";
  2. cout << string(e);

Y pierdo el poder convertir el char* en string, ¿no hay alguna solución para poderlo hacer?.

Saludos.

Bueno, quizás si nos aseguramos de lo que vamos a leer no contiene caracteres nulos hasta el final.


En línea

Cuando el poder económico parasita al político ningún partido ni dictador podrá liberarnos de él. Se reserva el 99% ese poder.
class_OpenGL


Desconectado Desconectado

Mensajes: 437

Si usas Direct3D, no eres mi amigo :P


Ver Perfil
Re: Pasar de char* a string pérdida de datos
« Respuesta #1 en: 6 Noviembre 2015, 12:10 pm »

Lo que delimita el tamaño de una cadena de caracteres es precisamente el carácter nulo. Si no hubiera un carácter nulo, entonces no sabríamos cual es el tamaño de la cadena. Entonces, cuando un objeto de tipo std::string toma los datos, lo hace hasta que encuentra un carácter nulo (repito, no hay otra forma segura de hacerlo). Lo único que puedes hacer es saber a ciencia cierta el tamaño de la cadena (el tamaño podría estar almacenado en una variable, por ejemplo). Una vez sabido esto, podrías reemplazar todos los caracteres nulos por otro carácter a tu elección:

Código
  1. std::string cString;
  2. char *lpbyData = "aisjiajisfj\0buenas";
  3. size_t nNumCharacters = 19; // No contamos el carácter nulo del final
  4.  
  5. for(size_t i = 0; i < nNumCharacters; i++ {
  6.    if(lpbyData[i] == '\0')
  7.        lpbyData[i] = '~'; // Pon el carácter de tu elección
  8. }
  9.  
  10. cString = lpbyData;


« Última modificación: 6 Noviembre 2015, 19:50 pm por class_OpenGL » En línea

Programador aficionado. Me quiero centrar en programar videojuegos. La API que uso para crearlos es OpenGL
Kaxperday


Desconectado Desconectado

Mensajes: 702


The man in the Middle


Ver Perfil WWW
Re: Pasar de char* a string pérdida de datos
« Respuesta #2 en: 6 Noviembre 2015, 19:23 pm »

Una vez sabido esto, podrías reemplazar todos los caracteres nulos por otro carácter a tu elección

Es lo que pensé pero podría fallar, ya que lo que hago es cifrar un archivo donde escribo bytes (u_char*), para llamar a write de ofstream debo usar un char* entonces hago la conversión, pero si algún byte vale nulo, valdrá \0 en la conversión y me cortará la cadena, podría sustiruirlo por otro carácter, aunque al final creo que lo mejor es usar fwrite.

Y aprovecho para preguntar si alguien conoce alguna clase de C++ para escribir bytes, ya que ofstream.write() en teoria es solo para char*. Y se corta en el primer carácter nulo.

Un saludo.
En línea

Cuando el poder económico parasita al político ningún partido ni dictador podrá liberarnos de él. Se reserva el 99% ese poder.
class_OpenGL


Desconectado Desconectado

Mensajes: 437

Si usas Direct3D, no eres mi amigo :P


Ver Perfil
Re: Pasar de char* a string pérdida de datos
« Respuesta #3 en: 6 Noviembre 2015, 19:30 pm »

Entonces, lo único que se me ocurre es que almacenes la cadena en un vector de chars:

Código
  1. std::vector<char> cData;
  2. const char *lpbyData = "aisjiajisfj\0buenas";
  3. size_t uNumCharacters = 19;
  4.  
  5. cData.reserve(uNumCharacters);
  6.  
  7. for(int i = 0; i < uNumCharacters; i++) {
  8.    cData[i] = lpbyData[i];
  9. }
En línea

Programador aficionado. Me quiero centrar en programar videojuegos. La API que uso para crearlos es OpenGL
ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: Pasar de char* a string pérdida de datos
« Respuesta #4 en: 7 Noviembre 2015, 00:41 am »

string no se basa siempre en los caracteres nulos para iniicalizarse mediante un puntero a char.
string tiene un constructor que recibe como primer parámetro el puntero a char, y como segundo parámetro la longitud de la cadena. Es uno de los constructores posibles cuando se trabaja con cadenas de datos binarios.
En línea

Kaxperday


Desconectado Desconectado

Mensajes: 702


The man in the Middle


Ver Perfil WWW
Re: Pasar de char* a string pérdida de datos
« Respuesta #5 en: 7 Noviembre 2015, 18:27 pm »

Si pero luego al llamar a c_str() se cortará en el primer \0 ¿no?, luego no habría valido para nada.

Código
  1. struct datos{u_char *contenido; int tamaño;};//vector<u_char>
  2.  
  3. void almacen::escribir(datos _datos)
  4. {
  5. ofstream archivo;
  6. archivo.open(directorio, ofstream::app | ofstream::binary);
  7. _datos = encriptador.encriptar_AES(_datos);
  8. archivo.write(reinterpret_cast<char*>(_datos.contenido), _datos.tamaño);
  9. //archivo.write(string((char*)_datos.contenido, _datos.tamaño).c_str(), _datos.tamaño);
  10. archivo.close();
  11. }

Ahí dejo el code problemático.

Saludos.

Edito: lo que dice ivancea es verdad gracias por la informacion del constructor, pero al pasar a c_str() se corta en la primera \0 como es de esperar, luego para escribir bytes con ofstream.write() no podemos hacerlo, puesto que necesitamos char* y si hay algun byte nulo se nos cortara la cadena.

Seguramente pase a fwrite.

Saludos.
« Última modificación: 8 Noviembre 2015, 00:32 am por Kaxperday » En línea

Cuando el poder económico parasita al político ningún partido ni dictador podrá liberarnos de él. Se reserva el 99% ese poder.
ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: Pasar de char* a string pérdida de datos
« Respuesta #6 en: 8 Noviembre 2015, 01:47 am »

c_str() retorna la cadena completa. Y size() retorna el tamaño de la cadena. Así pues, no, no corta nada. Pero eso sí, si trabajar con cadenas binarias, trabajas siempre con métodos para ese tipo de cadenas. ni ostream::operator<<, ni strlen, ni otras funciones o métodos que se valgan de '\0' directa o indirectamente para determinar la longitud de la cadena.
Lo único que hace c_str(), al igual que data() a partir de C++11, es agregar un caracter nulo al final, siendo el tamaño real de la cadena devuelta de size()+1. Pero si trabajas con datos binarios, ese caracter nulo final es suplerfluo.
En línea

Kaxperday


Desconectado Desconectado

Mensajes: 702


The man in the Middle


Ver Perfil WWW
Re: Pasar de char* a string pérdida de datos
« Respuesta #7 en: 8 Noviembre 2015, 12:14 pm »

Buenas socio, me recomiendas usar fwrite y fread para trabajar con bytes en C++, ¿o conoces algo mejor?.

Por lo que has dicho, ¿esto no se cortaría?:

Código
  1. string cadena = reinterpret_cast<char*>(_datos.contenido);
  2. archivo.write(cadena.c_str(), cadena.size());

?? Saludos.
En línea

Cuando el poder económico parasita al político ningún partido ni dictador podrá liberarnos de él. Se reserva el 99% ese poder.
ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: Pasar de char* a string pérdida de datos
« Respuesta #8 en: 8 Noviembre 2015, 12:25 pm »

Buenas socio, me recomiendas usar fwrite y fread para trabajar con bytes en C++, ¿o conoces algo mejor?.

Por lo que has dicho, ¿esto no se cortaría?:

Código
  1. string cadena = reinterpret_cast<char*>(_datos.contenido);
  2. archivo.write(cadena.c_str(), cadena.size());

?? Saludos.

Estás construyendo mal la string. Estás construyendola pasándole solo un char*.

Citar
string tiene un constructor que recibe como primer parámetro el puntero a char, y como segundo parámetro la longitud de la cadena. Es uno de los constructores posibles cuando se trabaja con cadenas de datos binarios.

En línea

Kaxperday


Desconectado Desconectado

Mensajes: 702


The man in the Middle


Ver Perfil WWW
Re: Pasar de char* a string pérdida de datos
« Respuesta #9 en: 8 Noviembre 2015, 12:33 pm »

Ah si perdon, se me escapó, pero si la construyo con 2 argumentos (char*, tamaño) pasa lo mismo, pues el c_str() corta al primer \0, aunque le digamos escribe 50 char, cuando el write encuentra el primer \0 deja de escribir ¿no?.

Saludos.
En línea

Cuando el poder económico parasita al político ningún partido ni dictador podrá liberarnos de él. Se reserva el 99% ese poder.
Páginas: [1] 2 Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Char[] != String « 1 2 »
Programación General
Hendrix 19 9,746 Último mensaje 22 Agosto 2011, 03:54 am
por someRandomCode
Como pasar una cadena char a hexadecimal por argumento a un constant char?
Programación C/C++
ahaugas 3 4,880 Último mensaje 13 Enero 2013, 14:09 pm
por ahaugas
Pasar tipo const char* a char « 1 2 »
Programación C/C++
jorge_hura 15 10,671 Último mensaje 25 Julio 2013, 09:50 am
por Eternal Idol
Problema con string, char, etc
Programación C/C++
GenR_18 2 1,725 Último mensaje 21 Septiembre 2013, 19:30 pm
por GenR_18
Pasar cadena String a una variable Char en C++
Programación C/C++
RGT 3 2,446 Último mensaje 6 Noviembre 2015, 16:19 pm
por class_OpenGL
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines