Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Søra en 15 Diciembre 2010, 16:16 pm



Título: Cifrador root 13
Publicado por: Søra en 15 Diciembre 2010, 16:16 pm
Ola a todos he intentado hacer un codigo que cifre un archivo en root 13 y el gcc me da error solo 1 no e logrado solucionar.

Código
  1. #include <stdio.h>
  2. #define root 13
  3. main() {
  4. printf("¿Número de carácteres?\n");
  5. int num;
  6. scanf("%i",&num);
  7. char vector[num];
  8. int c;
  9. FILE *comprob;
  10. comprob = fopen("archivo.txt","rb");
  11. if (comprob==NULL) {
  12. printf("No existe el archivo\n"); }
  13. else {
  14. int i;
  15. for (i=0; i<num; i++) {
  16.          c = fgetc(comprob);
  17.          vector[i]=c;}
  18.  
  19. vector[i] = '\0';
  20. fclose(comprob);
  21. int a,b;
  22.  
  23. char z,buffer2[58],buffer3[10000];
  24. buffer2 = *"abcdefghijklmnñopqrstuvwxyz1234567890¿?()/&%$·!¡-.,;: ><*+";
  25. for (a=0; a<num; a++) {
  26.        for (b=0; b<58; b++) {
  27.            if (vector[a]==buffer2[b]) {
  28.                    z = a + root;
  29.                    buffer3[a] = buffer2[z]; }}}}
  30.             return 0;}

el error del gcc es:

Código:
codesC# gcc cifrador.c
cifrador.c: In function ‘main’:
cifrador.c:24: error: incompatible types when assigning to type ‘char[58]’ from type ‘char’


Título: Re: Cifrador root 13
Publicado por: pucheto en 15 Diciembre 2010, 16:47 pm
El * que pusiste en frente de
Código
  1. buffer2 = *"abcdefghijklmnñopqrstuvwxyz1234567890¿?()/&%$·!¡-.,;: ><*+";
es el problema.

De todas formas tu error es quererle asignar a un array otro puntero... lo q tenes q hacer es un memcpy..


Título: Re: Cifrador root 13
Publicado por: Søra en 15 Diciembre 2010, 17:13 pm
Acabo de leer como va el funcionamiento del memcpy sirve para copiar los primeros terminos de un objeto a otro pero no se como aplicarlo ya que yo no copio los n primeros terminos solo 1 no?? donde deberia ponerlo..


Título: Re: Cifrador root 13
Publicado por: Shell Root en 15 Diciembre 2010, 18:28 pm
La verdad no se lo que intentas hacer con el archivo. XD
Código
  1. char buffer2[58] = "abcdefghijklmnñopqrstuvwxyz1234567890¿?()/&%$·!¡-.,;: ><*+";


Título: Re: Cifrador root 13
Publicado por: Søra en 15 Diciembre 2010, 18:38 pm
Da= :) si lo cambio me da este error:

Código:
cifrador.c:24: error: incompatible types when assigning to type ‘char[58]’ from type ‘char *’


Título: Re: Cifrador root 13
Publicado por: pucheto en 15 Diciembre 2010, 19:24 pm
Pensa a los arrays como punteros...

vos queres hacer algo asi:
Código
  1. char buf[58]; //reservo un array del tamaño q quiero.
  2. memcpy(buf,"abcdefghijklmnñopqrstuvwxyz1234567890¿?()/&%$·!¡-.,;: ><*+",58); //aclaro una cosa, el string ese q vos pones tiene tamaño 59, ya que como es un string, tiene un '/0' al final, pero copio solo lo q me interesa q es hasta el 58.
  3.  

No probé compilar pero debería andar.

Un poco sobre memcpy... hay un ejemplo bastante claro al final...
http://www.cplusplus.com/reference/clibrary/cstring/memcpy/ (http://www.cplusplus.com/reference/clibrary/cstring/memcpy/)

Código
  1. for (i=0; i<num; i++) {
  2.          c = fgetc(comprob);
  3.          vector[i]=c;
  4. }
  5. vector[i] = '\0'; //Aca el seg fault
  6.  
Estoy casi seguro q da segmentation fault.
Pq al salir del ciclo i es igual a num, entonces te pasas en 1 el tamaño del arreglo, pero creo, no me puse a analizar bien.


Título: Re: Cifrador root 13
Publicado por: Arkangel_0x7C5 en 15 Diciembre 2010, 20:34 pm
si no vas a modificar la cadena puedes hacer esto:
Código
  1. char* buffer2 = "abcdefghijklmnñopqrstuvwxyz1234567890¿?()/&%$·!¡-.,;: ><*+";
  2.  
y si lo piensas modificar haz esto antes del main:
Código
  1. char buffer2[] = "abcdefghijklmnñopqrstuvwxyz1234567890¿?()/&%$·!¡-.,;: ><*+";
  2.  


Título: Re: Cifrador root 13
Publicado por: Søra en 15 Diciembre 2010, 21:59 pm
Vale jeje creo que a sido una giñada de codigo :) el objetivo era cifrar un archivo de texto con root 13 pero algo deve fallar, he quitado la "b" a la hora de abrir archivos para que no los abra en modo binario pero aun asi cuando cifra el archivo da un tipo de archivo no reconocido y al descifrarlo pasa =, dejo el codigo.

CIFRADOR
Código
  1. #include <stdio.h>
  2. #define root 13
  3. main() {
  4. char z,buffer3[10000];
  5. printf("¿Número de carácteres?\n");
  6. int num;
  7. scanf("%i",&num);
  8. char vector[num];
  9. int c;
  10. FILE *comprob;
  11. comprob = fopen("archivo.txt","r");
  12. if (comprob==NULL) {
  13. printf("No existe el archivo\n"); }
  14. else {
  15. int i;
  16. for (i=0; i<num; i++) {
  17.          c = fgetc(comprob);
  18.          vector[i]=c;}
  19.  
  20. vector[i] = '\0';
  21. fclose(comprob);
  22. int a,b;
  23.  
  24.  
  25. char* buffer2 = "abcdefghijklmnñopqrstuvwxyz1234567890¿?()/&%$·!¡-.,;: ><*+";
  26. for (a=0; a<num; a++) {
  27.        for (b=0; b<58; b++) {
  28.            if (vector[a]==buffer2[b]) {
  29.                    z = a + root;
  30.                    buffer3[a] = buffer2[z]; }}}}
  31. FILE *comprobfin;
  32. comprobfin = fopen ("cifrado.txt","w+");
  33.  
  34. int d;
  35. for (d=0; d<num; d++) {
  36. fputc (buffer3[d],comprobfin); }
  37.             return 0;}

DESCIFRADOR
Código
  1. #include <stdio.h>
  2. #define root 13
  3. main() {
  4. char z,buffer3[10000];
  5. printf("¿Número de carácteres?\n");
  6. int num;
  7. scanf("%i",&num);
  8. char vector[num];
  9. int c;
  10. FILE *comprob;
  11. comprob = fopen("cifrado.txt","r");
  12. if (comprob==NULL) {
  13. printf("No existe el archivo\n"); }
  14. else {
  15. int i;
  16. for (i=0; i<num; i++) {
  17.          c = fgetc(comprob);
  18.          vector[i]=c;}
  19.  
  20. vector[i] = '\0';
  21. fclose(comprob);
  22. int a,b;
  23.  
  24.  
  25. char* buffer2 = "abcdefghijklmnñopqrstuvwxyz1234567890¿?()/&%$·!¡-.,;: ><*+";
  26. for (a=0; a<num; a++) {
  27.        for (b=0; b<58; b++) {
  28.            if (vector[a]==buffer2[b]) {
  29.                    z = a - root;
  30.                    buffer3[a] = buffer2[z]; }}}}
  31. FILE *comprobfin;
  32. comprobfin = fopen ("archivo.txt","w+");
  33.  
  34. int d;
  35. for (d=0; d<num; d++) {
  36. fputc (buffer3[d],comprobfin); }
  37.             return 0;}

a ver si me ayudan :(