Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Kaxperday en 2 Septiembre 2015, 03:03 am



Título: Problema al obtener string de archivo cifrado
Publicado por: Kaxperday en 2 Septiembre 2015, 03:03 am
Bueno, para acabar la noche escribo este post.

Miren tengo un archivo que divido en campos con delimitadires, escribo cadenas encriptadas en cada campo. El problema es que luego al obtener esas cadenas no las recojo correctamente, creo que es porque uso string en vez de char o no sé.

Lo leo todo su contenido así:

Código
  1. string almacen::obtener_campo(int campo)
  2. {
  3. ifstream archivo;
  4. archivo.open(directorio, ifstream::in);
  5. if (!archivo)
  6. return "";
  7. else{
  8. string contenido;
  9. while (archivo.good())
  10. contenido += archivo.get();
  11. archivo.clear();
  12. archivo.close();
  13. }
  14.  

Me dice que tiene lo siguiente:

Citar
CPcqGW51VRuFPRzAxwEMholaaaaaaaaque haaceess maripooossssssssssa7mgF5BDu2xspuP4DtANxO■¦©^×{oT╗┐Gç_÷SÆs
È~©BüQ³f5Ä{░µ ðø¥¹Q:╗\‗Y╚§.áë╔¾¶ÈÙ│Ï,jI¸Ñ°┴!▀Òs

Pero el archivo con el bloc de notas muestra lo siguiente:

Citar
CPcqGW51VRuFPRzAxwEMholaaaaaaaaque haaceess maripooossssssssssa7mgF5BDu2xspuP4DtANxOþݸ^ž{oT»¿G‡_öS’s
¢&H‹>VßnÎÀeØo®QNЛ¾ûQ:»\òYÈõ. ‰ÉóôÔë³Ø,jI÷¥øÁ!ßãs
Ô¶~¸BQüf5Ž{°æÔ;pÉE^ª•€UÏ·Ù¹ÒÛŒM™ÈuUÌvýýýý^ÿ^ÿnyFtCn4jPKItqWCAdJn6QTMTgH0wSWCMQOKA3H6OxDNJOWH2PIWCy3k79QJwÿ

¿Porque no accedo a todos los datos? ¿acaso no puedo obtener todos los caracteres con ifstream.get()? ¿qué solución puedo dar?

Saludos y gracias.

Edito: Sin embargo caracteres alfanumericos los lee sin problemas, pero los raros no.. ¿ que son ? xd

Edito: Acabo de abrirlo en binario || fstream::binary  y el resultado ha sido el mismo.


Título: Re: Problema al obtener string de archivo cifrado
Publicado por: ivancea96 en 2 Septiembre 2015, 10:18 am
No trates de mostrar por pantalla datos binarios. En su lugar, muestra la longitud de la cadena , un checksum, o muestra los caracteres en hexadecimal.
En cualquier caso, no hay nunca necesidad de ver la cadena binaria. Simplemete descifrala o conviertela al tipo de dato que representa.


Título: Re: Problema al obtener string de archivo cifrado
Publicado por: RockPosts en 2 Septiembre 2015, 12:42 pm
Respuesta corta: hay un carácter nulo en tu cadena. Descargar un programa para ver archivos en hexadecimal para ver donde está el caracter nulo.

Respuesta larga: Cuando muestras una cadena de texto, o string, lo que haces es imprimir caracter a caracter la cadena. ¿Cómo sabes cuando la cadena ha llegado a su fin? La consola no sabe la longitud de la cadena. Por ello, hay que usar un sistema para delimitar la cadena. Lo que se ha estandarizado es usar un caracter no gráfico (no se muestra por pantalla), y cuando se llega a ese caracter, significa que la cadena ha terminado. Ese caracter tiene un valor nulo, es decir, 0. En conclusión, hay un caracter nulo en tu cadena. Puedes comprobar eso con programas que abren el archivo y te muestran su contenido en hexadecimal. Comprueba donde está ese caracter nulo.

PD.: Recomiendo el HxD para ver archivos en hexadecimal


Título: Re: Problema al obtener string de archivo cifrado
Publicado por: Kaxperday en 5 Septiembre 2015, 21:39 pm
Hola a todos, el problema estaba en que tenía que leerlo en binario para no perder datos, puesto que como lo hacía leía menos bytes.

Código que permitió leer todos los bytes del archivo:

Código
  1. ifstream archivo;
  2. archivo.open(directorio, ifstream::binary);// ifstream::in || ifstream::binary);
  3. if (!archivo)
  4. return true;
  5. else{
  6. string contenido;
  7. archivo.seekg(0, ifstream::end);
  8. streampos size = archivo.tellg();
  9. char *memblock = new char[size]();
  10. archivo.seekg(0, ifstream::beg);
  11. archivo.read(memblock, size);
  12. archivo.close();
  13. contenido = string(memblock);

De todas formas gracias por las respuestas, aunque las leo ahora, lo solucioné poco después de escribir el tema, y quedé sin conexión a internet, y he estado desconectado hasta hoy, ya os digo que está solucionado, pero gracias.

Saludos.