Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Alguien me puede ayudar con un código CRC?

Estas en el tema de Alguien me puede ayudar con un código CRC? en el foro de C/C++ en Foros del Web. 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 ...
  #1 (permalink)  
Antiguo 20/01/2010, 16:25
 
Fecha de Ingreso: septiembre-2009
Mensajes: 10
Antigüedad: 14 años, 7 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
}
  #2 (permalink)  
Antiguo 21/01/2010, 03:07
 
Fecha de Ingreso: enero-2010
Mensajes: 24
Antigüedad: 14 años, 3 meses
Puntos: 0
Respuesta: Alguien me puede ayudar con un código CRC?

Buenas

Debajo te pongo un codigo (basado en el tuyo) que calcula el crc de "hola mundo" con:

Valor Inicial = 0;
Valor Final XOR = 0;
Sin revertir los bytes y/o el valor del CRC antes del ultimo XOR.

Que viendo tu codigo creo que coincide.

El resultado del codigo lo he comprobado con el de la web:
http://zorc.breitbandkatze.de/crc.html

Y si te interesa el tema aqui tienes una guia:
http://www.cs.waikato.ac.nz/~312/crc.txt

Deberias comprobar con que opciones (las que puse arriba) fue generado el valor del CRC del fichero que tienes para pruebas.

Código C:
Ver original
  1. int main(int argc, char *argv[])
  2. {
  3.   int i=0,j=0;
  4.   int reg, byt;
  5.   unsigned int crc, eor;
  6.   unsigned char trama[500000],byte=0;
  7.   long bytes_fichero, bytes_cogidos;
  8.  
  9. /*
  10.   FILE *fichero;
  11.  
  12.   if (argc != 2)
  13.   {
  14.     fprintf (stderr, "Numero de parametros incorrecto\n");
  15.     return -1;
  16.   }
  17.  
  18.   fichero = fopen(argv[1],"rb"); //Abrimos el fichero para lectura binaria.
  19.   if (fichero == (FILE *) NULL)
  20.   {
  21.     fprintf (stderr, "Error abriendo el archivo [%s]\n", argv[1]);
  22.     return  -1;    
  23.   }
  24.  
  25.   fseek(fichero,0L,SEEK_END); //Coloca el puntero al final del fichero.
  26.   bytes_fichero = ftell(fichero); //Nos dice la posicion del puntero.
  27.  
  28.   rewind(fichero);
  29. */
  30.  
  31.   crc = 0;
  32.  
  33.   memcpy (trama, "hola mundo", 10);
  34.   bytes_fichero = bytes_cogidos = 10;  
  35.  
  36.   while(bytes_fichero>0)
  37.   {
  38. /*
  39.     memset (trama, 0, sizeof(trama));
  40.     bytes_cogidos = fread(trama,sizeof(unsigned char),500000,fichero);
  41. */
  42.     for(j=0;j<bytes_cogidos;j++)
  43.     {
  44.       i=8;
  45.       byte = trama[j];
  46.      
  47.       crc ^= (unsigned int)byte << 24;
  48.       for (i=0; i<8; i++)
  49.       {
  50.         eor = crc & 0x80000000 ? 0x4c11db7 : 0;
  51.         crc <<= 1;
  52.         crc ^= eor;
  53.       }      
  54.     }
  55.     bytes_fichero = bytes_fichero-bytes_cogidos;
  56.   }
  57.  
  58. /*
  59.   fclose (fichero);
  60. */
  61.  
  62.   fprintf (stderr, "Valor del CRC: [%x]\n", crc);
  63.  
  64.   return 0;
  65. }
  #3 (permalink)  
Antiguo 21/01/2010, 04:49
 
Fecha de Ingreso: septiembre-2009
Mensajes: 10
Antigüedad: 14 años, 7 meses
Puntos: 0
Respuesta: Alguien me puede ayudar con un código CRC?

Gracias! lo pruebo luego y te comento!
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 03:27.