Problema al obtener string de archivo cifrado

Iniciado por Kaxperday, 2 Septiembre 2015, 03:03 AM

0 Miembros y 1 Visitante están viendo este tema.

Kaxperday

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 (cpp) [Seleccionar]
string almacen::obtener_campo(int campo)
{
ifstream archivo;
archivo.open(directorio, ifstream::in);
if (!archivo)
return "";
else{
string contenido;
while (archivo.good())
contenido += archivo.get();
archivo.clear();
archivo.close();
}


Me dice que tiene lo siguiente:

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

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

CitarCPcqGW51VRuFPRzAxwEMholaaaaaaaaque haaceess maripooossssssssssa7mgF5BDu2xspuP4DtANxOþݸ^ž{oT»¿G‡_öS's
¢&H‹>VßnÎÀeØo®QNЛ¾ûQ:»\òYÈõ. ‰ÉóôÔë³Ø,jI÷¥øÁ!ßãs
Ô¶~¸BQü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.
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

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.

RockPosts

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

Kaxperday

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 (cpp) [Seleccionar]
ifstream archivo;
archivo.open(directorio, ifstream::binary);// ifstream::in || ifstream::binary);
if (!archivo)
return true;
else{
string contenido;
archivo.seekg(0, ifstream::end);
streampos size = archivo.tellg();
char *memblock = new char[size]();
archivo.seekg(0, ifstream::beg);
archivo.read(memblock, size);
archivo.close();
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.
Cuando el poder económico parasita al político ningún partido ni dictador podrá liberarnos de él. Se reserva el 99% ese poder.