Ver Mensaje Individual
  #1 (permalink)  
Antiguo 20/01/2010, 16:25
Icko
 
Fecha de Ingreso: septiembre-2009
Mensajes: 10
Antigüedad: 14 años, 8 meses
Puntos: 0
Alguien me puede ayudar con un código CRC?

Hola! Muy buenas!
Soy un universitario que estoy haciendo un programa para unas practicas de una asignatura.

El problema es que hay una que no se que estoy haciendo mal, porque el concepto creo que si que lo tengo claro, pero no lo entiendo muy bien.

Vereis, me dan un polinomio generador. En este caso uno de 32 bits, que es:

g(x) = x³²+x²⁶+x²³+x²²+x¹⁶+x¹²+x¹¹+x¹⁰+x⁸+x⁷+x⁵+x⁴+x²+x+1

Con este polinomio debo leer los datos de un fichero, y calcular su valor CRC, e imprimirlo en Hex...

pero no me va :(
Compilar compila, pero saco en Hex un valor que nada tiene que ver con el que me tiene que dar segun la resolución...

Alguien me puede ayudar?
Os pego el code. Muchas gracias!


Código:
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>


main(int argc, char *argv[]){

	int i=0,j=0,bytes_cogidos=0;
	bool reg=false,byt=false;
	unsigned int crc=0;
   unsigned char trama[500000],byte=0;
  
	

	FILE *fichero;
	fichero = fopen(argv[1],"rb"); //Abrimos el fichero para lectura binaria.

  fseek(fichero,0L,SEEK_END); //Coloca el puntero al final del fichero. 
  long  bytes_fichero = ftell(fichero); //Nos dice la posicion del puntero.  

  rewind(fichero); 

  while(bytes_fichero>0)
   {
     bytes_cogidos = fread(trama,sizeof(unsigned char),500000,fichero);
	     for(j=0;j<bytes_cogidos;j++)
	        {
              byte = trama[j];
       		   for(i=0;i<8;i++)
	       	      {
			          reg=((crc & 0x0001)==0x0001);     //Hacemos mascara con primer bit
    		          byt=((byte & 0x80)==0x80); //hacemos mascara con el ultimo
					    crc=((crc & 0x0000ffff)>>1);
			          if ((reg^byt)==1) {crc=crc^0x4C11DB7;} //XOR con la mascara del polinomio
			          byte=byte <<1;
		            }
          }
      bytes_fichero = bytes_fichero-bytes_cogidos;		
	}
	printf("%x",crc); //Para imprimir a hexadecimal
}