[C con Clase] CRC

Bernardo Reyes bernardo5304 en gmail.com
Vie Ago 31 00:41:46 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