Utilisateur anonyme
-
19 mars 2010 à 11:12
ordiman85
Messages postés41Date d'inscriptionsamedi 4 mars 2006StatutMembreDernière intervention19 mars 2010
-
19 mars 2010 à 20:54
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);
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)
ordiman85
Messages postés41Date d'inscriptionsamedi 4 mars 2006StatutMembreDernière intervention19 mars 2010 19 mars 2010 à 20:54
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);