bueno lo estava pensando y lo queria hacer el Rotate funcion ,
uso = ROT(sCadena,numero de rotar) , el numero tambien puede ser negativo :P

Código: Seleccionar todo

/*
////Ceasar Snippet Coded m4rtyr\\\\
 si lo usas no quitas los creditos 
\\\\     indetectables.net     ////
*/
#include <windows.h>
#include <stdio.h>
unsigned char * ROT(unsigned char *sCadena,int num)
{
	
unsigned char * sNeuvo=new unsigned char[strlen((const char *)sCadena)+1];
unsigned char u;int limit=0;
for(int i=0;i<strlen((const char *)sCadena);i++){
int tnum=num;
	bool flag=false;
if(sCadena[i]>='a' && sCadena[i]<='z') {u='a';limit='z'-'a'+1;}
else if(sCadena[i]>='A' && sCadena[i]<='Z') {u='A';limit='Z'-'A'+1;}
else if(sCadena[i]>='0' && sCadena[i]<='9') {u='0';limit='9'-'0';flag=true;}
else if(sCadena[i]>=' ' && sCadena[i]<='/') {u=' ';limit='/'-' '+1;}
else if(sCadena[i]>=':' && sCadena[i]<='@') {u=':';limit='@'-':'+1;}
else if(sCadena[i]>='[' && sCadena[i]<='`') {u='[';limit='`'-'['+1;}
else if(sCadena[i]>='{' && sCadena[i]<='~') {u='{';limit='~'-'{'+1;}
else {sNeuvo[i]=sCadena[i];continue;}

if(tnum<0){////Rot numero es negativo
tnum*=-1;
if (tnum>limit)while(tnum>limit)tnum-=limit;
if(sCadena[i]-u>=tnum)sNeuvo[i]=sCadena[i]-tnum;
else sNeuvo[i]=limit-(tnum-(sCadena[i]-u))+u;
if(flag&&sCadena[i]=='0')sNeuvo[i]+=1;///////en caso el numero zero
}
else{////Rot numero es positivo
if (tnum>limit)while(tnum>limit)tnum-=limit;//si el num es mas grande que el range
int dif=(sCadena[i]-u)-(limit-tnum);
if(flag)dif-=1;
if(dif>=0)sNeuvo[i]=u+dif;
else sNeuvo[i]=sCadena[i]+tnum;
}}
sNeuvo[strlen((const char *)sCadena)]='\0';
return sNeuvo;
}


void main(){
	char * str="z0egle# #vaqrgrpgnoyrf!arg";
	printf("%s\n",ROT((unsigned char *)str,13));
}
saludos

Mostrar/Ocultar

He intentado reducir tu code por probar a hacerlo en c (ya lo tenía implementado en haskell), a ver si te gusta
Las soluciones como el 2º ejemplo, es decir, rot(13,string); las podeis comprobar en esta web [Enlace externo eliminado para invitados]
Si alguien se anima puede hacer la encriptación Caesar con esta función, ya que usa Rot13.

Código: Seleccionar todo

//rot_r007.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

/**********************************************
* Coder: R-007                                *
* Functions:                                  *
* rot(int n, string)                          *
* rot modification, original by m4rtyr        *
* Indetectables.net/foro                      *
* Date: 21/12/2010                            *
**********************************************/

char *rot(int n, char * str)
{
  int ascii;
  char * strNew = malloc(strlen(str));
  int i= 0;
  while (i < strlen(str)){
    if(isalpha(str[i])){  //requires ctype.h
      //then 'a' or 'A' is the first char in lowcase or uppercase alpha's
	   if(str[i]>='a') ascii = 'a'+((str[i]-'a'+n)%26);//mod 26 chars distance
	   else ascii = 'A'+((str[i]-'A'+n)%26);
      strNew[i] = ascii; 
    }
    else strNew[i] = str[i];		    
    i++;
  } 
  return strNew;
}

int main ()
{
  char* original = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789@#~½¬";
  char* example1 = rot(1,original);
  char* example2 = rot(13,original);
  printf("ROT FUNCTION BY R-007:");
  printf("\n----------------------------");
  printf("\noriginal:%s",original);
  printf("\nexample1:%s",example1);
  printf("\nexample2:%s",example2);
  printf("\n----------------------------");
  printf("\nPress any key to continue...");
  getchar();
  return 0;
}

//eof rot_r007.c
R-007 escribió:He intentado reducir tu code por probar a hacerlo en c (ya lo tenía implementado en haskell), a ver si te gusta
muy bueno tu codigo :)
pero no lo queria hacer solo para letras , tambien numeros , y special characters (=+\ etc)
saludos amigo

Mostrar/Ocultar

justamente esa idea la había implementado antes de sacar esta versión, porque es más simple que sólo para letras.
pero la pega que tiene es que al sumar la rotación, puede poner caracteres no imprimibles y por eso intenté ceñirme a la definición de ROT normal que es sólo para letras.

pero vamos si lo quieres para cualquier caracer lo único que tienes que cambiar son las condiciones de los ifs por lo siguiente:

Código: Seleccionar todo

ascii = (str[i] + n)%255; //modulo 255 <- el conjunto es ASCII [0..255]
strNew[i] = ascii;
a mí particularmente me gusta la definición original, pero si te gusta más ésta versión y quieres que no te imprima cosas raras por pantalla simplemente aplicale una función toHex y que te muestre el codigo ASCII de cada caracter y listo ;)

Un saludo!
R-007 escribió: pero la pega que tiene es que al sumar la rotación, puede poner caracteres no imprimibles

pero vamos si lo quieres para cualquier caracer lo único que tienes que cambiar son las
creo que no analysastes mi codigo bien :P
si te das cuenta todos los characters estan ahi
if(sCadena>='a' && sCadena<='z') {u='a';limit='z'-'a'+1;}
else if(sCadena>='A' && sCadena<='Z') {u='A';limit='Z'-'A'+1;}
else if(sCadena>='0' && sCadena<='9') {u='0';limit='9'-'0';flag=true;}
else if(sCadena>=' ' && sCadena<='/') {u=' ';limit='/'-' '+1;}
else if(sCadena>=':' && sCadena<='@') {u=':';limit='@'-':'+1;}
else if(sCadena[i]>='[' && sCadena[i]<='`') {u='[';limit='`'-'['+1;}
else if(sCadena[i]>='{' && sCadena[i]<='~') {u='{';limit='~'-'{'+1;}


todos los characters son imprimidos depues de implementar un Rot incluyendo los numeros y special characters
un saludo

Mostrar/Ocultar

bueno para gustos están las variantes de ROT ;) jajajaja
si te funciona así perfecto :)

un saludo m4rtyr
Responder

Volver a “Fuentes”