Lire gros fichier En C + CRC32

Signaler
-
Messages postés
41
Date d'inscription
samedi 4 mars 2006
Statut
Membre
Dernière intervention
19 mars 2010
-
Bonjour;


je souhait calculer le CRC32 d'un fichier donc google a été mon ami (encore que...)

Mais je le probleme c'est que lorsque je veux calculer le crc32 d'un gros fichier (cad 300mo environ ce qui n'est plus trés volumineux aujourd'hui :) )
Et bien mon programme plante:

Voici ma methode de calcule


code pour calculer le CRC32
/* Table of CRCs of all 8-bit messages. */
unsigned long crc32_table[256];

/* Flag: has the table been computed? Initially false. */
int crc32_table_computed = 0;

/* Make the table for a fast CRC. */
void make_crc32_table(void)
{
  unsigned long c;
  int n, k;
  for (n = 0; n < 256; n++) {
    c = (unsigned long) n;
    for (k = 0; k < 8; k++) {
      if (c & 1) {
        c = 0xedb88320L ^ (c >> 1);
      } else {
        c = c >> 1;
      }
    }
    crc32_table[n] = c;
  }
  crc32_table_computed = 1;
}

unsigned long Update_CRC32(unsigned long crc, unsigned char *buf, int len)
{
  unsigned long c = crc ^ 0xffffffffL;
  int n;

  if (!crc32_table_computed)
    make_crc32_table();
  for (n = 0; n < len; n++) {
    c = crc32_table[(c ^ buf[n]) & 0xff] ^ (c >> 8);
  }
  return c ^ 0xffffffffL;
}




Mon code...

FILE *INFILE; 
unsigned long Calcul32;
Calcul32 = 0L; 
unsigned char Checksum[1024] = "";


INFILE = fopen("./cat/1.avi", "rb"); 
                         
                      
  // deplace le curseur a la fin
  fseek(INFILE,0,SEEK_END);
  // taille du fichier
  long sizeFile=ftell(INFILE);
  sizeFile = sizeFile + 1;
  // on se repositionne au debut
  fseek(INFILE,0,SEEK_SET);
  // allocation
  char * chaine =NULL;
  chaine =(char*)malloc(sizeFile);
                      
                
 if (INFILE != NULL){
  fgets(chaine, sizeFile, INFILE); // On lit maximum TAILLE_MAX caractères du fichier, on stocke le tout dans "chaine"
  printf("%s\n", chaine); // On affiche la chaîne
  Calcul32 = Update_CRC32(Calcul32, chaine, strlen(chaine));
  fclose(INFILE);
  free(chaine);
  sprintf(Checksum, "%08x", Calcul32);
                        
  printf("%s",Checksum);
}
free(chaine);
fclose(INFILE);

/code

Le truck que j'aimerais faire c'est ne pas stocker tout le fichier en une fois dans "chaine" mais en plusieurs fois ...

CEla fait deux jours que je planche dessus et là je commence à faire un "buffer overflow" lol.

j'ai vraiment besoin de votre savoir et pas me sortir google et ton ami car en deux jours j'ai ratissé les sites et meme le code de l'application "Hash Finder" (DL sur ce le site)

MErci d'avance.

3 réponses


Personne???

PLIZZZZ
Messages postés
933
Date d'inscription
dimanche 1 avril 2001
Statut
Modérateur
Dernière intervention
9 janvier 2012
2
Regarde cette source tu trouveras ton bonheur : http://www.cppfrance.com/codes/CRC32-ULTRA-SIMPLE-WIN32_32855.aspx

Regarde aussi du côté des commentaires (les derniers).


@+
Arnotic,
Admin CS
Messages postés
41
Date d'inscription
samedi 4 mars 2006
Statut
Membre
Dernière intervention
19 mars 2010

Salut,

tu n'es pas obligé de lire tout le fichier d'un seul coup, mais tu peux lire par blocs de taille "Taille_Tampon", pour ne pas consommer beaucoup de mémoire et aussi rendre le programme plus fluide.


FILE *INFILE; 
unsigned long Calcul32;

unsigned char Checksum[10] = "";

const int Taille_Tampon = 64 * 1024;
unsigned long long int len;
unsigned char buffer[Taille_Tampon];

// Initialisation
Calcul32 = 0L;

INFILE = fopen("./cat/1.avi", "rb");
if (INFILE != NULL){

  // Ici se passe le calcul par blocs
  while (len = fread(buffer, 1, Taille_Tampon, INFILE)) {
    Calcul32 = Update_CRC32(Calcul32, buffer, strlen(chaine));
  }

}
fclose(INFILE);

sprintf(Checksum, "%08x", Calcul32);
printf("%s",Checksum);


Cordialement,
Charly