Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Otros entornos y lenguajes > C++ Builder
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 22-10-2015
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Poder: 14
aguml Va por buen camino
Pues al final lo he solucionado abriendolo de forma binaria. No se porque si no es asi falla y me gustaria saberlo.
Responder Con Cita
  #2  
Antiguo 22-10-2015
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.211
Poder: 22
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
Cita:
Empezado por aguml Ver Mensaje
Pues al final lo he solucionado abriendolo de forma binaria. No se porque si no es asi falla y me gustaria saberlo.
No hice pruebas con tu código pero recuerda que en modo texto las líneas acaban en CRLF. Es la gran diferencia entre los dos modos de abrir un archivo. Cuando el texto está codificado siempre es preferible el modo binario.

Personalmente no me gustan los stream de C++ y los uso en muy contadas ocasiones. Incluso he detectado bugs en en mismo código fuente de Builder C++ 5 que arreglé en su momento con cambios en el mismo.


Saludos.
Responder Con Cita
  #3  
Antiguo 22-10-2015
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Poder: 14
aguml Va por buen camino
Asi he dejado el codigo:
Main.cpp:
Código PHP:
//---------------------------------------------------------------------------
#include <iostream>
#include <fstream.h>
#include "Vigenere.h"
//---------------------------------------------------------------------------

using namespace std;

void InfoUso();
void Desencriptar(char *nameFileIn, char *semilla, char *nameFileOut);
void Encriptar(char *nameFileIn, char *semilla, char *nameFileOut);

int main(int argc, char *argv[])
{
   if(
argc == 5){
      if(
argv[1][0] == 'e' && argv[1][1] == '\0'){
         
Encriptar(argv[2],argv[3],argv[4]);
         
cout << "Operacion finalizada." << endl;
      }else if(
argv[1][0] == 'd' && argv[1][1] == '\0'){
         
Desencriptar(argv[2],argv[3],argv[4]);
         
cout << "Operacion finalizada." << endl;
      }else{
         
cout << "Opcion no valida." << endl;
         
InfoUso();
      }
   }else if(
argc<5){
      
cout << "Faltan argumentos." << endl;
      
InfoUso();
   }else{
      
cout << "Sobran argumentos." << endl;
      
InfoUso();
   }
   return 
0;
}

void InfoUso()
{
   
cout << "Vigenere.exe [operacion] [archivo] [semilla]" << endl;
   
cout << "operacion: 'd' desencriptar. 'e' encriptar." << endl;
   
cout << "archivo: ruta completa del archivo o solo el nombre si esta junto a este ejecutable." << endl;
   
cout << "semilla: la cadena que va a ser usada como semilla para encriptar/desencriptar el archivo." << endl;
}

//Funcion que encripta el archivo
void Encriptar(char *nameFileIn, char *semilla, char *nameFileOut)
{
   
ifstream origen;
   
ofstream salida;
   
char *cadena;

   
origen.open(nameFileIn,ios::binary);

   if(
origen.good()){
      
origen.seekg(0,ios::end);
      
int length = origen.tellg();
      
origen.seekg(0,ios::beg);
      
cadena = new char[length+1];
      
Vigenere *vig = new Vigenere;
      
salida.open(nameFileOut,ios::binary | ios::trunc);

      if(
salida.good()){
         
origen.read(cadena,length);
         
cadena[length]='\0';
         
salida.write(vig->cifrar(cadena, semilla).c_str(),length);
         
salida.close();
      }
      
delete vig;
      
delete(cadena);
      
origen.close();
   }
}

//Funcion que desencripta el archivo
void Desencriptar(char *nameFileIn, char *semilla, char *nameFileOut)
{
   
ifstream origen;
   
ofstream salida;
   
char *cadena;

   
origen.open(nameFileIn,ios::binary);

   if(
origen.good()){
      
origen.seekg(0,ios::end);
      
int length = origen.tellg();
      
origen.seekg(0,ios::beg);
      
cadena = new char[length+1];
      
Vigenere *vig = new Vigenere;
      
salida.open(nameFileOut,ios::binary | ios::trunc);

      if(
salida.good()){
         
origen.read(cadena,length);
         
cadena[length]='\0';
         
salida.write(vig->descifrar(cadena, semilla).c_str(),length);
         
salida.close();
      }
      
delete vig;
      
delete(cadena);
      
origen.close();
   }
} 
Vigenere.h:
Código PHP:
//---------------------------------------------------------------------------
#ifndef VigenereH
#define VigenereH
//---------------------------------------------------------------------------
#include <cstring.h>

class Vigenere{
   private:
      
string texto,semilla,caracteresValidos;
      
string limpiar(string cadena);
      
//Las variables son privadas, el metodo limpiar
      //es privada ya que solo lo utilizan los otros
      //metodos para limpiar la entrada

   
public:
      
Vigenere();
      ~
Vigenere();
      
string cifrar(string orig, string sem);
      
string descifrar(string orig, string sem);
      
//Esto es publico porque es la unica forma de
      //accesar a los datos de la clase
};
//---------------------------------------------------------------------------
#endif 
Vigenere.h:
Código PHP:
/************************************************
*  Nombre : Vigenere.cpp                        *
*                                               *
*  Cifrado de cesar de sustitución multiple     *
*  por medio de sumas y restas del alfabeto     *
*                                               *
*  Fulapol                                      *
*  [email protected]                            *
*  my.opera.com/fulapol                         *
*                                               *
************************************************/

/************************************************
*                                               *
*  El Constructor que debe recibir la cadena a  *
*  tratar y la cadena semilla                   *
*                                               *
************************************************/
#include "Vigenere.h"

Vigenere::Vigenere(){
   
caracteresValidos = "abcdefghijklmnñopqrstuvwxyzABCDEFGHIJKLMNÑOPQRSTUVWXYZáéíóúÁÉÍÓÚüÜ1234567890¿?¡!,;.:-_ \"\t\n\r\\<>(){}[]^çÇ=+*/&%$#@";
}

Vigenere::~Vigenere(){

}
/************************************************
*                                               *
*  El metodo cifrar, que regresa una cadena de  *
*  texto que solo despues de ser cifrada        *
*                                               *
************************************************/

string Vigenere::cifrar(string orig, string sem){
   
string final;
   
unsigned int i, rotacion, total;
   
int pos, pos2;
   
//Las variables serviran para registrar la posicion
   //de las letras y calcular la semilla

   
this->texto = limpiar(orig);
   
this->semilla = limpiar(sem);

   for(
i=0; i < texto.length(); i++){
      
rotacion = i%semilla.length();
      
pos = caracteresValidos.find(texto.at(i));
      
pos2 = caracteresValidos.find(semilla.at(rotacion));
      
total = (pos+pos2)%caracteresValidos.length();
      
//El total que marca la posicion de la letra y la
      //semilla sumadas

      
final.append(caracteresValidos, total, 1);
   }
   return final;
}

/************************************************
*                                               *
*  El metodo descifrar, que regresa una cadena  *
*  de texto que solo despues de ser descifrada  *
*                                               *
************************************************/

string Vigenere::descifrar(string orig, string sem){
   
//La funcion es exactamente la misma que en el metodo
   //cifrar, solo que aqui las posiciones se restan para
   //eliminar la semilla del texto

   
string final;
   
unsigned int i, rotacion, total;
   
int pos, pos2;

   
this->texto = limpiar(orig);
   
this->semilla = limpiar(sem);

   for(
i=0; i<texto.length(); i++){
      
rotacion = i%semilla.length();
      
pos = caracteresValidos.find(texto.at(i));
      
pos2 = caracteresValidos.find(semilla.at(rotacion));
      
total = (caracteresValidos.length() + pos - pos2) % caracteresValidos.length();

      final.
append(caracteresValidos, total, 1);
   }
   return final;
}

/************************************************
*                                               *
*  El metodo limpiar, que regresa una cadena de *
*  texto que solo contiene los caracteres       *
*  soportados por la clase                      *
*                                               *
************************************************/

string Vigenere::limpiar(string cadena){
   
unsigned int i;
   
string final;
   for(
i=0; i < cadena.length(); i++){
      if(
caracteresValidos.find(cadena.at(i)) != -1)
         final.
append(&cadena.at(i),1);
      
//Agregamos a la cadena final el caracter
      //si se encuentra en la variable letras
   
}
   return final;
} 
Responder Con Cita
  #4  
Antiguo 25-10-2015
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Poder: 14
aguml Va por buen camino
Ahora tengo otra duda. Si en vez de usar ese cifrado quisiese usar uno de desplazamientos, o sea tener un array con los caracteres válidos y a la función le meto una cadena y un valor de desplazamiento como por ejemplo encriptar ("hola",3). Cada caracter se desplazaría 3 posiciones en el array de letras con lo que quedaría "krñd". ¿como seria eso para cifrar y descifrar? Llevo toda la tarde y no doy con la forma correcta para que no desborde y de un resultado correcto.
He visto que ese cifrado se llama Cesar y vi esto: https://es.m.wikipedia.org/wiki/Cifrado_César
El problema con esas fórmulas es que imaginen que la letra es la z y el desplazamiento es 0:
Salida=(27+0)%27=0
Sí no hay desplazamiento debería dar 27 ¿no?

Última edición por aguml fecha: 25-10-2015 a las 21:41:20.
Responder Con Cita
  #5  
Antiguo 25-10-2015
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.211
Poder: 22
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
Cita:
Empezado por aguml Ver Mensaje
El problema con esas fórmulas es que imaginen que la letra es la z y el desplazamiento es 0:
Salida=(27+0)%27=0
Sí no hay desplazamiento debería dar 27 ¿no?
El problema es de concepto. La tabla de caracteres empieza en elemento 0, por lo que el último carácter es el 26 y no el 27.

Saludos.
Responder Con Cita
  #6  
Antiguo 25-10-2015
Avatar de BDWONG
BDWONG BDWONG is offline
Miembro
NULL
 
Registrado: nov 2013
Posts: 113
Poder: 13
BDWONG Va por buen camino
Porque harias un desplazamineto a cero

mira este codigo

Código:
#include <iostream>
using namespace std;


string cifrarCesar(const string cadena, const int rotacion){
   string sFinal=cadena;
   for(unsigned int i=0;i<cadena.length();i++){
        sFinal[i]=char(int(cadena[i])+(rotacion %256));
   }
   return sFinal;
}
string descifrarCesar(const string cadena, const int rotacion){
   string sFinal=cadena;
   for(unsigned int i=0;i<cadena.length();i++){
        sFinal[i]=char(int(cadena[i])-(rotacion %256));
   }
   return sFinal;
}


int main()
{
    string cadena=cifrarCesar("hola mundo",3);
    cout<<cadena<<endl;
    string descifrada=descifrarCesar(cadena,3);
    cout<<descifrada<<endl;
    return 0;
}
Responder Con Cita
  #7  
Antiguo 25-10-2015
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.211
Poder: 22
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
Cita:
Empezado por BDWONG Ver Mensaje
Porque harias un desplazamineto a cero
Al menos en teoría debe funcionar para cualquier desplazamiento sin preguntar si es o no cero, que es lo que se plantea aguml. La explicación que dí y que aplicas a tu código: el primer carácter es el 0 y el último 255, siendo en total 256.


Salidos.
Responder Con Cita
  #8  
Antiguo 25-10-2015
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Poder: 14
aguml Va por buen camino
Después de analizar mi prueba creo que esto funciona correctamente:
Encriptar:
Código PHP:
int largo,posInicial,posFinal;
char Mensaje []="HOLA";
char Letras []="ABCDEFGHIJKLMNÑOPQRSTUVWXYZ";
int numero=5;
 
largo = strlen (Letras);
posInicial = strchr (Letras,Mensaje [i]);
posFinal = (largo + posInicial + numero) % largo;
Mensaje [i]=Letras [posFinal]; 
Desecriptar:
Código PHP:
int largo,posInicial,posFinal;
char Mensaje []="MTPF";
char Letras []="ABCDEFGHIJKLMNÑOPQRSTUVWXYZ";
int numero=5;
 
largo = strlen (Letras);
posInicial = strchr (Letras,Mensaje [i]);
posFinal = (largo + posInicial - numero) % largo;
Mensaje [i]=Letras [posFinal]; 
Largo da 27 mientras que el máximo de pos es 26. El fallo lo tenia porque a largo le quitaba 1.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
con FindComponent en una dll no compila aguml C++ Builder 3 30-12-2014 14:33:20
Pasar mi clase a una clase de 3 capas o lo mas parecido elarys OOP 2 07-04-2011 23:02:54
No compila FastReport Chogo Varios 3 18-06-2010 21:32:42
clase que contiene otra clase definida de forma posterior astwin OOP 5 20-02-2009 11:26:55
Mi aplicacion no compila Lizette Varios 2 08-11-2008 16:24:25


La franja horaria es GMT +2. Ahora son las 08:29:34.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi