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 21-10-2015
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Poder: 14
aguml Va por buen camino
Lo he solucionado con esta linea de codigo:
Código PHP:
final.append(&cadena.at(i),1); 
Eso funciona correctamente aunque quizas no sea la mejor manera y me gustaria saber como hacerlo usando append y de la manera mas correcta posible.
Responder Con Cita
  #2  
Antiguo 21-10-2015
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Poder: 14
aguml Va por buen camino
Ahora he modificado el codigo un poco y sobre todo he añadido mas caracteres a la mascara de caracteres válidos y ya no funciona correctamente. Tengo esto:
Main.cpp:
Código PHP:
//---------------------------------------------------------------------------
#include <iostream>
#include "Unit1.h"
//---------------------------------------------------------------------------

int main()
{
   
string cadena "Hola Mundo, como te va.";
   
string semilla "aguml";

   
Vigenere *vig = new Vigenere;
   
string cifrada vig->cifrar(cadenasemilla);
   
std::cout << cifrada << std::endl;

   
string descifrada vig->descifrar(cifradasemilla);
   
std::cout << descifrada << std::endl;
   
delete vig;
   
std::cin.get();

   return 
0;

Unit1.cpp:
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 "Unit1.h"

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

Vigenere::~Vigenere(){

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

string Vigenere::cifrar(string origstring sem){
   
string final;
   
int imovimientorotaciontotal;
   
size_t pospos2;
   
//Las variables serviran para registrar la posicion
   //de las letras y calcular la semilla

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

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

      
if(total letras.length())
         
movimiento total letras.length();
      else
         
movimiento total;
      
//Para asegurarnos que esta dentro del rango

      
final.append(letrasmovimiento1);
      if(
rotacion == semilla.length() - 1)
         
rotacion 0;
      
//Si se acaba la semilla, regresar al principio
   
}
   return final;
}

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

string Vigenere::descifrar(string origstring 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;
   
int imovimientorotaciontotal;
   
size_t pospos2;

   
this->texto limpiar(orig);
   
this->semilla limpiar(sem);
   
   for(
i=0rotacion=0i<texto.length(); i++, rotacion++){
      
pos letras.find(texto.at(i));
      
pos2 letras.find(semilla.at(rotacion));
      
total = ((int)(pos pos2)) % letras.length();
      if(
total 0)
         
movimiento total letras.length();
      else
         
movimiento total;
      final.
append(letrasmovimiento1);
      if(
rotacion == semilla.length() - 1)
         
rotacion 0;
   }
   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){
   
int i;
   
string final;
   for(
i=0cadena.length(); i++){
      if(
letras.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;

Unit1.h:
Código PHP:
//---------------------------------------------------------------------------
#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <cstring.h>

class Vigenere{
   private:
      
string texto,semilla,letras;
      
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 origstring sem);
      
string descifrar(string origstring sem);
      
//Esto es publico porque es la unica forma de
      //accesar a los datos de la clase
};
//---------------------------------------------------------------------------
#endif 
¿Como la pongo correctamente la máscara?
Responder Con Cita
  #3  
Antiguo 22-10-2015
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.210
Poder: 22
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
Prueba así:
Código PHP:
string Vigenere::cifrar(string origstring sem){
   
string final;
   
int irotaciontotal;
   
int pospos2;
   
//Las variables serviran para registrar la posicion
   //de las letras y calcular la semilla

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

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

      
final.append(letrastotal1);
   }
   return final;
}


string Vigenere::descifrar(string origstring 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;
   
int irotaciontotal;
   
int pospos2;

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

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

      final.
append(letrastotal1);
   }
   return final;

Saludos.

PD/ Cuidado con la salida por consola, algunos caracteres pueden salir cambiados.

Última edición por escafandra fecha: 22-10-2015 a las 02:14:07.
Responder Con Cita
  #4  
Antiguo 22-10-2015
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Poder: 14
aguml Va por buen camino
Si si, lo de los caracteres lo se pero es simplemente para hacer una prueba. Si fuese a leer o escribir en un archivo usando fread y fwrite no pasaria.
La verdad es que estudiando tu codigo y el que yo tenia veo que el que yo tenia tenia condicionales que eran redundantes pero no veo cual era el problema ya que haciendo las cuentas en ambos creo que funcionan igual. ¿me puedes explicar donde estaba el fallo exactamente para que diera resultados no validos?
Responder Con Cita
  #5  
Antiguo 22-10-2015
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.210
Poder: 22
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
Cita:
Empezado por aguml Ver Mensaje
¿me puedes explicar donde estaba el fallo exactamente para que diera resultados no validos?
La codificación era correcta pero no la descodificación. El problema estaba aquí:
Código PHP:
total = (pos pos2) % letras.length(); 
Si se sobrepasó la longitud de letras al codificar, (pos-pos2) no elimina la semilla correctamente y la resta será negativa. Dado que pos1+pos2 nunca puede ser mayor que 2*letras.length(), la solución es esta:
Código PHP:
total = (letras.length() + pos pos2) % letras.length(); 

Saludos.
Responder Con Cita
  #6  
Antiguo 22-10-2015
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Poder: 14
aguml Va por buen camino
Ahora estoy intentando hacer lo mismo con un archivo de texto plano y hago esto:
Código PHP:
//---------------------------------------------------------------------------
#include <iostream>
#include <fstream.h>
#include "Vigenere.h"
//---------------------------------------------------------------------------

using namespace std;

int main()
{
   
ifstream origen;
   
ofstream salida;
   
string semilla,cifrada,descifrada;
   
char *cadena;

   
semilla "aguml";
   
   
//Parte que encripta el archivo
   
origen.open("Main.h");

   if(
origen.good()){
      
origen.seekg(0,origen.end);
      
int length origen.tellg();
      
origen.seekg(0,origen.beg);
      
cadena = new char[length+1];
      
Vigenere *vig = new Vigenere;
      
salida.open("Encriptado.txt");

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

   
//Parte que desencripta el archivo
   
origen.open("Encriptado.txt");

   if(
origen.good()){
      
origen.seekg(0,origen.end);
      
int length origen.tellg();
      
origen.seekg(0,origen.beg);
      
cadena = new char[length+1];
      
Vigenere *vig = new Vigenere;
      
salida.open("Desencriptado.txt");

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

Tengo dos problemas.
1. El archivo se abre la primera vez pero despues de cerrarlo intento abrirlo una segunda vez y parece que hay algun problema porque no entra en la parte de desencriptar.
2. Me añade basura al final del archivo y eso que pongo el caracter de fin de cadena al final de la cadena.
¿puedes ayudarme?
Responder Con Cita
  #7  
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
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 15:44:07.


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