[C con Clase] Ayer servia , hoy no U-U CRC

Bernardo Reyes Reyes bernardo5304 en gmail.com
Vie Ago 31 00:51:59 CEST 2007


Disculpen , podrian ayudarme a corregir mi programa . Ayer lo compile
en la escuela y funciono , pero en este momentos estoy en un cybercafe
y al compilarlo veo que ya no sirve :-s y no se que pueda ser, he
probado la funcion division con algunos otros numeros  y me funciono
con uno :-s
Gracias



#include "funciones.c"

int main(){
char *residuo=(char*)malloc(sizeof(char)*strlen(p));
char *mensaje_binario;
char msj[MAX];
int i=0;
printf("Introduce la cadena :  ");
fgets(msj, MAX, stdin);
mensaje_binario=(char*)malloc(sizeof(char)*strlen(msj)*8+1+n);

strcpy(mensaje_binario,DecimalBinario(msj[i]));

for(i=1;i<strlen(msj)-1;i++) strcat(mensaje_binario,DecimalBinario(msj[i]));
printf("\n Mensaje en binario %s",mensaje_binario);

corrimiento(mensaje_binario,n);
//mensaje_binario[strlen(mensaje_binario)]='\0';
printf("\n Mensaje en binario con corrimiento: %s\n\n\n",mensaje_binario);

printf("\n CRC 16: %s", p);
residuo= division(mensaje_binario,p);

printf("\n El residuo de la division es : %s\n", residuo);

printf("\n Aņadiendo bits para la deteccion de errores...");
retardo();
XOR(mensaje_binario,residuo);
printf("\n \n \n Trama a enviar: %s", mensaje_binario);
residuo= division(mensaje_binario,p);

printf("\n\n\n COMPROBANDO...\n");
retardo();
printf("\n El residuo de la division entre la trama y el polinomio es
: %s\n\n\n\n", residuo);

system("pause");
}






#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<string.h>
#define MAX 31

char p[]="11000000000000101";
int n=16;
/*CRC-16: x16 + x15 + x2 + 1. Para flujos de 8 bits, con 16 de redundancia.
 Usado en Estados Unidos, principalmente*/
void XOR(char *x,char *y){

   int i=strlen(x)-strlen(y);
   int j=0;
   while(x[i]!='\0'){
       if(x[i]==y[j])x[i]='0';
       else x[i]='1';
       i++;
       j++;
       }

  }
void correr_izq(char *cad){
   int i;
   for(i=0;cad[i]!='\0';i++) cad[i]=cad[i+1];
   }

/*===Quta ceros despues del XOR====*/
int quitar_ceros_izq(char *cad){
   int cont=0;
   while(cad[0]=='0'){
       correr_izq(cad);
       cont++;
       }
       return cont;
   }

char* division(char *msj, char *p){
   int long_msj=strlen(msj);
   int long_p=strlen(p);
   int cont=0;
   int cont2=long_p; //Nos ayuda a saber hasta donde hemos dividido
   int i;
   int ceros;

   char *res=(char*)malloc(sizeof(char)*long_msj);
   char *aux2=(char*)malloc(sizeof(char)*long_p);

   strncpy(aux2,msj,long_p);
   res[0]='1';
   cont++;

   while(cont2<=long_msj){
       res[cont]='\0';
       XOR(aux2,p);
       ceros=quitar_ceros_izq(aux2);

       int auxx=strlen(aux2);
       for(i=0;i<ceros;i++,cont2++,cont++){    //Baja tantos numeros
del dividendo
               aux2[auxx+i]=msj[cont2];        //como ceros hallan
quedado luego del XOR
               aux2[strlen(aux2)]='\0';        //y pone en el resultado 0
               res[cont]='0';
               }


               res[cont-1]='1'; //Al terminar de bajar los ceros , ya
se puede dividir,
                               //por eso ponemos 1

       }
   if(strlen(aux2)==0) aux2[0]='0';  //Si el ultimo XOR da puros
ceros , estos son eliminados
   //y la lngitud de la cadena queda en cero, indicando que el
residuo fue cero.
   return aux2;


   }

/*====Convierte una letra a su representacion en binario====*/
char* DecimalBinario (unsigned char decimal)
 {
  int i=0,j=0,contador=0;
  unsigned char array[40];
  char    aux[40];
  char cad[49];
  unsigned char resultado;
   do
     {
        resultado=decimal%2;
        decimal=decimal/2;
        array[i]=resultado;
        i=i+1;
        contador=contador+1;
     }while(decimal!=0);

         for (i=contador-1,j=0;i>=0;j++,i--) //Se debe invertir la cadena
           {

                if(array[i]==0) aux[j]='0';
                else aux[j]='1';
                aux[j+1]='\0';

           }




    return aux;
 }


void corrimiento(char*cad, int n){ //Corrimiento a la izquierda de n "bits"
   int len=strlen(cad);
   int i;
   cad[len]='0';
   for(i=0;i<n;i++) cad[len+i]='0';
   cad[len+n]='\0';
   }

void retardo    ()
{
   time_t start_time = time(NULL); //Toma la hora del sistema
   while (difftime(time(NULL), start_time) < 3.0)  ; //Hasta que la
diferencia entre la hora actual
   //y la guardada sea 3 se rompe el ciclo

}


Más información sobre la lista de distribución Cconclase