Hola, estaba creando una especie de encriptador y de momento solo cifra textos planos por que cuando intento cifrar imagenes,videos,exes pues en el código fuente tiene valores nulos que mi programa no cifra, entonces pense que si se podría abrir un fichero como hexadecimal, busque un poco y solo encontre como pasar de char a hexadecimal, pero no como abrir ficheros en hexadecimal.
RESUMEN:Como puedo abrir un fichero como hexadecimal en C++
Fácil, abrelo en modo binario:
ifstream Lectura;
Lectura.open(Nombre,ios::binary);
Lees un byte cualquiera:
int Byte;
Lectura.read((char*) &Byte,1);
Y obtienes su valor en decimal, luego ya trasteas con el como quieras.
Para escribir lo mismo:
Escritura.open(Nombre,ofstream::binary);
Escritura.write((char*) &Byte,1);
De hecho ponerse a diferenciar entre ficheros de texto y binarios es una tonteria, si quieres hacer un encriptador simplemente abre todos los ficheros en binario.
Saludos.
Ok, los NUL ya los lee y los escrive, pero encripte una imagen y a partir de un SUB, ya no cifra nada más.
No se lo que significa SUB pero cuando abro el fichero con notepad++ me sale eso y a partir de ese punto no cifra nada más.
Cuelgo una imagen
(http://i46.tinypic.com/ke9bh2.jpg)
Usa mejor un editor hexadecimal (Yo uso HxD).
Has comprobado si se ha activado el EOF?
Parece que el sub indique cuando se finaliza el fichero, si que se activa y deja de leer.
En hexa el sub es el 1A
por eso decia de intentar abrir directamente el archivo como hexadecimal para poder leer sin problemas el archivo.
Lo has advierto en modo binario como te dije?.
Una cosa que puedes hacer es calcular el tamanyo del archivo y leerlo del tiron:
ifstream Lectura;
Lectura.open(Nombre,ios::binary);
Lectura.seekg (0, ios::end);
int Tamanyo =Lectura.tellg();
Lectura.seekg (0,ios::beg);
int* Datos = new int[Tamanyo];
Lectura.read((char*)& Datos,Tamanyo);
Todo lo que quieras trastear está en el array "datos". Y despues para escribir igual:
Escritura.write((char*) &Datos,Tamanyo);
Cita de: Stakewinner00 en 31 Enero 2013, 16:33 PMpor eso decia de intentar abrir directamente el archivo como hexadecimal para poder leer sin problemas el archivo.
Ese modo "hexadecimal" es el modo binario... Con eso puedes obtener el valor de cada Byte (en formato decimal que es más fácil).
Ok, ya esta arreglado, muchas gracias por todo, el fallo lo tenia en una función, donde hay 2 archivos de textos que los abro y cierro múltiples veces y en una de esas veces no puse el ,ios::binary.
En concreto me olvide de lo suiguiente.
ifstream is;
is.open (str,ios::binary); //Str es el archivo a cifrar
if (!is)
{
cout << endl << endl << "ERROR EN EL ARCHIVO"; return 0;
}
string mens2="";
cout << endl << endl << "PUEDE TARDAR SEGUNDOS DEPENDIENDO DE LA LONGITUD DEL TEXTO" << endl << endl;
is.seekg(0, ios::end);
long size = is.tellg();
is.seekg(0, ios::beg);
is.close();
is.open (str,ios::binary); // Aki no había el ios::binary
double long index2=0;
int ch;
ofstream myfile;
myfile.open ("CR1M2.txt",ios::binary);
while (index!=size)
Cuando declaras un objeto de la clase string su valor inicial es una cadena vacía, esto no es necesario:
string mens2="";
Basta con la declaración:
string mens2;
Un saludo
A si, es verdad, pero como estaba inseguro lo puse por si acaso, ahora lo quito.
Cita de: Stakewinner00 en 31 Enero 2013, 17:11 PM
Ok, ya esta arreglado, muchas gracias por todo, el fallo lo tenia en una función, donde hay 2 archivos de textos que los abro y cierro múltiples veces
No tienes que abrir y cerrar el mismo archivo multiples veces... Para rebobinar puedes usar la función Lectura.seekg(0, ios::beg); y para limpiar el EOF (si estuviera activado) puedes usar la función Lectura.clear();
Cita de: amchacon en 31 Enero 2013, 18:09 PM
No tienes que abrir y cerrar el mismo archivo multiples veces... Para rebobinar puedes usar la función Lectura.seekg(0, ios::beg); y para limpiar el EOF (si estuviera activado) puedes usar la función Lectura.clear();
Ok, supongo que esto sera más rápido que cerrarlo y abrirlo.