begin process at 2012 05 30 03:22:18
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C

 > 

Divers

 > 

Divers

 > 

lire gros fichier En C + CRC32


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

lire gros fichier En C + CRC32

vendredi 19 mars 2010 à 11:12:12 | lire gros fichier En C + CRC32

ar1du62

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
Code C/C++ :
/* 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...
Code C/C++ :

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.

vendredi 19 mars 2010 à 12:42:40 | Re : lire gros fichier En C + CRC32

ar1du62

Personne???

PLIZZZZ
vendredi 19 mars 2010 à 20:39:58 | Re : lire gros fichier En C + CRC32

Arnotic

Administrateur CodeS-SourceS
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
vendredi 19 mars 2010 à 20:54:21 | Re : lire gros fichier En C + CRC32

ordiman85

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.


Code C/C++ :
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


Cette discussion est classée dans : table, code, chaine, crc32, infile


Répondre à ce message

Sujets en rapport avec ce message

CRC32 qui ne correspond pas [ par CyberP ] J'ai testé ce code que j'ai trouvé sur le net :const DWORD crc32_table[] = { 0UL, 16777216UL, 33554432UL, 50331648UL, 67108864UL, 83886080UL, 10066329 Ca me semble impossible mais on sait jamais [ par iaco71 ] Est-il possible de faire passer une chaine de caaractere en code ?C'est impossible puisque le code est deja compilé une fois qu'on saisi la chaine mai passage d'argement chaine [ par victorcoasne ] Je fais :int taille(char chaine[]){ cout return (sizeof(chaine)/sizeof(chaine[0])); }int main(){char Probleme de caractere dans un tableau [ par byoushin ] Bonjour,J'ai un tableau a 2 dimensions qui ressemble a ca :0 1 2 3 4 5 6 7 8 91 0 0 0 0 0 0 0 0 02 0 0 0 0 0 0 0 0 03 0 0 0 0 0 0 0 0 04 0 0 0 0 Petit problème de code [ par mimyne ] Bonjour g le code suivant:void Resultat_Clicked(Object* pSender, EventArgs* pArgs){ int operation = 5; char* chaine[10]; if (pSender == Btnres) { //o Problème de code en c++ (fonction itoa) [ par mimyne ] voila g le code suivant:void Resultat_Clicked(Object* pSender, EventArgs* pArgs){ int operation = 5; char* chaine[2]; if (pSender == Btnres) { { ito convertion chaine de caractere commencant par 0 en entier [ par humnanamouch ] bonjourEn fait j'ai une chaine de caractere avec 8 chiffres qui correspond à un code ascii et je voudrais pouvoir recuperer  le caractere qui correspo Comversion de chaine en grand nombre et calcul [ par nitrique ] Bonjour à tous,Il me faut convertir une string de 10 caractères numériques en entier et faire des opérations ensuite, mais ça ne marche pas...(val est [.net c++] explication d'un code [ par stgi02 ] <span lang="EN-GB" style="FONT-SIZE: 10pt; COLOR: bl Conversion d'une chaine de caractere en code hexadecimal [ par Ahryman40k ] Bonjour,j'ai le petit probleme suivant, je dois genere par code un fichier .regje veux convertir des caracteres d'une chaine en hexa et les stocker en


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 8,065 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales