Ver Mensaje Individual
  #2 (permalink)  
Antiguo 21/01/2010, 03:07
Megamouse
 
Fecha de Ingreso: enero-2010
Mensajes: 24
Antigüedad: 15 años
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. }