[Ayuda] [C++] #include "Base64.hpp" [Solucionado]

Iniciado por Antruck1821, 13 Agosto 2011, 19:05 PM

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

Antruck1821

Saludo, soy nuevo en el foro  :rolleyes:

Estaba buscando algo para cifrar en base64 en c++, encontré esto pero meda problema en #include "base64.hpp" Como soluciono el problema, trato de buscar en google pero nada o por lo menos no  ami, Compilador GCC, IDE CodeBlock.

Código (cpp) [Seleccionar]
#include <iostream>
#include <string>
#include <math.h>
#include <cstdio>
#include <cstdlib>

using namespace std;

class Base64
{
private:
  static string alfabeto;
  static string TextToBinBase(string a, int b);
  static void Reverse(string &a);
  static void Complete(string &a, int b);
public:
  static string Encode(string a);
  static string Decode(string a);
  static string Binary(int a, int b);
  static int BinToInt(string a);
  static string TextToBin(string a, int b);

};

Base64.cpp
Citar
#include "Base64.hpp"
#include <sstream>

using namespace std;

string Base64::alfabeto = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

string Base64::Binary(int a, int b)
{
  string result = "";
  while(a != 0)
  {
     if((a%2) == 0)
        result += '0';
     else
        result += '1';
     a = a/2;
  }

  Complete(result, b);
  Reverse(result);
  return result;
}

string Base64::Encode(string a)
{
  string binario = TextToBin(a, 8);
  stringstream ret;
  string *buffer;

  int padding;
  int alt = binario.length()%6;
  int aux;

  if(alt == 0)
  {
     int numcadenas = binario.length() / 6;
     buffer = new string[numcadenas];
     if(buffer != NULL)
     {
        for(int i = 0; i < numcadenas; i++)
        {
           buffer[ i ] = binario.substr(i*6, 6);
           aux = BinToInt(buffer[ i ]);
           ret << alfabeto.at(aux);
        }

        delete[] buffer;
     }
  }
  else
  {
     padding = (6 - alt) / 2;
     Complete(binario, binario.length() + (6-alt));
     int numcadenas = binario.length() / 6;
     buffer = new string[numcadenas];
     if(buffer != NULL)
     {
        int i;
        for(i = 0; i < numcadenas; i++)
        {
           buffer[ i ] = binario.substr(i*6, 6);
           aux = BinToInt(buffer[ i ]);
           ret << alfabeto.at(aux);
        }

        for(i = 0; i < padding; i++)
           ret<<"=";

        delete[] buffer;
     }
  }

  return ret.str();
}

string Base64::Decode(string a)
{
  string binario;
  string cadena;
  stringstream delpadding;

  int i;

  for(i = 0; i < a.length(); i++)
  {
     if(a.at(i) != '=')
        delpadding<<a.at(i);
  }

  cadena = delpadding.str();
  binario = TextToBinBase(cadena, 6);

  stringstream ret;
  string *buffer;

  int padding;
  int alt = binario.length()/8;
  int aux;

  buffer = new string[alt];

  if(buffer != NULL)
  {
     for(i = 0; i < alt; i++)
     {
        buffer[ i ] = binario.substr(i*8, 8);
        aux = BinToInt(buffer[ i ]);
        ret << (char)aux;
     }
     cout<<endl;
     delete[] buffer;
  }

  return ret.str();
}

string Base64::TextToBin(string a, int b)
{
  stringstream c;
  for(int i = 0; i < a.length(); i++)
  {
     c<<Binary((int)a.at(i), b);
  }
  return c.str();
}

string Base64::TextToBinBase(string a, int b)
{
  stringstream c;
  for(int i = 0; i < a.length(); i++)
  {
     int pos = (int)alfabeto.find(a.at(i));
     c<<Binary(pos, b);
  }
  return c.str();
}

void Base64::Reverse(string& a)
{
  string aux = "";
  for(int i = 0; i < a.length(); i++)
     aux += a.at(a.length() - i - 1);
  a = aux;
}

void Base64::Complete(string &a, int b)
{
  if(a.length() < b)
  {
     int fin = b - a.length();
     a.append(fin, '0');
  }
}

int Base64::BinToInt(string a)
{
  int aux = 0;

  for(int i = 0; i < a.length(); i++)
  {
     if(a.at(i) == '1')
     {
        float ex = a.length() -i -1;
        aux += (int)pow(2, ex);
     }
  }

  return aux;
}

Main.cpp
Citar
#include "Base64.hpp"

/*
Compilación utilizando g++:
g++ Main.cpp Base64.cpp -o base64

Uso:
base64 -flag string
Ej:
  base64 -c hola

Flags disponibles:

-c : cifra
-d : descifra

Se pueden cifrar cadenas más grandes a una sola palabra si se coloca todo entre comillas dobles
Ej:
  base64 -c "cifrando textos con espacios"
*/

using namespace std;

void usage()
{
  cout<<"Usage: "<<endl;
  cout<<"base64 -c string || Crypt a string to a Base64 string"<<endl;
  cout<<"base64 -d string || Decrypt a Base64 string"<<endl;
}

int main(int argv, char** args)
{
  if(argv != 3)
  {
     usage();
  }
  else
  {
     string op, str;
     op = args[1];
     str = args[2];

     if(op == "-d")
     {
        cout<<Base64::Decode(str)<<endl;
     }
     if(op == "-c")
     {
        cout<<Base64::Encode(str)<<endl;
     }
     if( (op != "-c") && (op != "-d"))
     {
        usage();
     }
  }
  return 0;
}
Los perdedores evitan el fracaso, y el fracaso convierte a los perdedores en ganadores.

Las dudas son caras.

Conocé la ley porque es más caro no conocerla.

El rico se enfoca en su columna de activos, mientras que todos los demás se enfocan en sus columnas de ingresos.

Uno a menudo se convierte en lo que estudia.

La emoción de ganar deber ser mayor al miedo de perder.