IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Algorithmes et structures de données Discussion :

CRC-32 Pas très clair


Sujet :

Algorithmes et structures de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif Avatar de Goundy
    Profil pro
    Étudiant
    Inscrit en
    Avril 2005
    Messages
    605
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2005
    Messages : 605
    Par défaut CRC-32 Pas très clair
    Bonjour les djeuns :]

    En lisant l'article de developpez.com sur l'implémentation du CRC-16, donc après avoir cru comprendre l'algorithme j'ai essayé de le refaire en 32bits :$
    Mais bon j'ai découvert que je n'avais compris que dale et mon algorithme marche pas car qu'on j'ajoute un espace DEVANT ma phrase la cléf reste la même :/
    Voilà ma source en C, et merci pour votre aide
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    #define _CCIT_POLYNOME		0x04c11db7
    #define _CCIT_INIT_VALUE	0x00000000
     
     
    /**************************************************/
    		/*Types definition*/
    typedef unsigned long long int  uint_64; /*unsigned 64bits*/ 
    typedef unsigned int   		uint_32; /*unsigned 32bits*/
    typedef unsigned short 		uint_16; /*unsigned 16bits*/
    typedef unsigned char  		uint_8;  /*unsigned 8bits*/
     
    typedef union{
    		uint_64 value;
    		struct{
    			uint_8 tail;
    			uint_32 remainder;
    			uint_8 head;
    		}part;
    }CRC32_PART;
     
    /**************************************************/
     
    /**************************************************/
    		/*Global declarations*/
    static CRC32_PART ccit_reg;
     
    /**************************************************/
     
    /**************************************************/
    		/*functions*/
    void OneBytesCrc32 (uint_8 byte){
     
    	int bitscounter = 8;
     
    		ccit_reg.part.tail = byte;
     
     
    			do{
    				ccit_reg.value <<= 1;	
    					if (ccit_reg.part.head & 0x01)
    						ccit_reg.part.remainder ^= _CCIT_POLYNOME;
    			}while (--bitscounter);
     
    }
     
    uint_32 StringtoCCIT32 (char* str, unsigned len){
     
    	int i;	
     
    		ccit_reg.part.remainder = _CCIT_INIT_VALUE;
    			for (i=0; i<len; i++)
    				OneBytesCrc32 (str[i]);
     
    		OneBytesCrc32 (0x00);
    		OneBytesCrc32 (0x00);
    		//OneBytesCrc32 (0x00);
    		//OneBytesCrc32 (0x00);
    	return ccit_reg.part.remainder;
    }
     
    /**************************************************/
     
    int main (int argc, char* argv[]){
     
    	char *p = "Developpez";
    	uint_32 crc;
     
    		crc = StringtoCCIT32 (p, strlen (p));
    	printf ("0x%x\n", crc);
     
     
     return 0;
    }
    Au passage, pourquoi on doit faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    OneBytesCrc32 (0x00);
    OneBytesCrc32 (0x00);
    ?
    Merci encore
    Compil your life guy!
    The Aures Project

  2. #2
    Membre très actif Avatar de Goundy
    Profil pro
    Étudiant
    Inscrit en
    Avril 2005
    Messages
    605
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2005
    Messages : 605
    Par défaut
    rhooo les mecs, que dale? personne ne peut me dire ou j'ai mauvais ?
    Compil your life guy!
    The Aures Project

  3. #3
    Membre Expert
    Avatar de Sivrît
    Profil pro
    Inscrit en
    Février 2006
    Messages
    953
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2006
    Messages : 953
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ccit_reg.part.remainder = _CCIT_INIT_VALUE
    L'initialisation est incomplète mais je chipotte.

    Head est toujours à 0, donc pas de XOR. Bref on a juste un décalage à gauche et un caractère ajouté au début ne laisse aucune trace quand on arrive au 'z'.

    Les adresses des différents morceaux :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    v=0x403010
    t=0x403010
    r=0x403014
    h=0x403018
    Voilà l'explication : tail mobilise 4 octets ce qui met head en dehors de nos 64 bits. Je suppose que c'est une question d'alignement sur des mots de 32 bits. Plus qu'à trouver une solution...

    Conclusion: printf est l'outil de débogage ultime

  4. #4
    Membre Expert
    Avatar de Sivrît
    Profil pro
    Inscrit en
    Février 2006
    Messages
    953
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2006
    Messages : 953
    Par défaut
    Une solution avec gcc:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    typedef union{
                    uint_64 value;
                    struct{
                            uint_8 tail;
                            uint_32 remainder;
                            uint_8 head;
                    } __attribute__ ((__packed__)) part;
    } CRC32_PART;
    Un peu bof. Sinon sortir l'arithmétique des pointeurs... bien bof aussi

  5. #5
    Membre Expert
    Avatar de Sivrît
    Profil pro
    Inscrit en
    Février 2006
    Messages
    953
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2006
    Messages : 953
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
     
    #define _CCIT_POLYNOME		0x00000004c11db700ULL
    #define _CCIT_INIT_VALUE	0x0000000000000000ULL
     
    typedef union{
            uint_64 value;
            uint_8 tail;
    }CRC32_PART;
     
    void OneBytesCrc32 (uint_8 byte){
        int bitscounter = 8;
        ccit_reg.tail = byte;
        do {
            ccit_reg.value <<= 1;	
            if (ccit_reg.value & 0x0000010000000000ULL)
                ccit_reg.value ^= _CCIT_POLYNOME;
        } while (--bitscounter);
    }
     
    uint_32 StringtoCCIT32 (char* str, unsigned len){
        int i;	
     
        ccit_reg.value = _CCIT_INIT_VALUE;
        for (i=0; i<len; i++)
            OneBytesCrc32 (str[i]);
     
        OneBytesCrc32 (0x00);
        OneBytesCrc32 (0x00);
     
        return (ccit_reg.value>>8) & 0xffffffff;
    }
    Edit: enfin trouvé comment entrer les litéraux de 64 bits

  6. #6
    Membre très actif Avatar de Goundy
    Profil pro
    Étudiant
    Inscrit en
    Avril 2005
    Messages
    605
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2005
    Messages : 605
    Par défaut
    Merci beaucoup, çà marche nickel maintenant par contre c'est assez sombre pour moi, comment tail pourrait-il mobiliser 4octets alors qu'il ne fait que 1 bit ???
    J'avoue que j'ai du mal, je croyais avoir compris mais là ...

    Sinon, pourquoi encore :
    OneBytesCrc32 (0x00);
    OneBytesCrc32 (0x00);
    ?

    merci
    Compil your life guy!
    The Aures Project

Discussions similaires

  1. Morceau de script pas très clair
    Par rouget dans le forum Unix
    Réponses: 2
    Dernier message: 18/11/2010, 09h14
  2. Tracker un "File does not exist" pas très claire.
    Par Moustico dans le forum Apache
    Réponses: 2
    Dernier message: 10/06/2010, 14h11
  3. Paragraphe pas très clair
    Par lulu51 dans le forum Contrat
    Réponses: 26
    Dernier message: 22/04/2008, 16h01
  4. 2 SELECT Qui ne s'entendent pas très bien entre eux :(
    Par moutanakid dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 05/08/2004, 16h46

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo