[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