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

C Discussion :

[Débutant] Traduction d'une fonction C en math


Sujet :

C

  1. #1
    Membre averti Avatar de dacid
    Homme Profil pro
    Inscrit en
    Juin 2003
    Messages
    1 064
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 064
    Points : 420
    Points
    420
    Par défaut [Débutant] Traduction d'une fonction C en math
    Bonjour à tous,

    J'ai besoin de comprendre le calcul fait par cette fonction (issue d'une doc) afin de le faire à la main.
    N'étant pas une élite des symboles C, je demande votre aide afin de transcrire ça en math.

    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
    This ‘C’ code segment and data table illustrates how the CRC is calculated.
     
    typedef unsigned int WORD;
    typedef unsigned char BYTE;
    typedef union{
    	WORD w;
    	struct{
    		BYTE lo, hi;
    	} b;
    } BYTEWORD;
    WORD ComputeCRC16(char *msg, int len){
    	BYTEWORD chksum;
    	unsigned char *msgchk;
    	chksum.w = 0xFFFF;
    	msgchk = (unsigned char *) msg;
    	while (len--){
    		chksum.w = chksum.b.hi ^ (ccittrev_tbl[chksum.b.lo ^ *msgchk++]);
    	}
    	chksum.w = ~chksum.w;
    	return(chksum.w);
    }
    Le CRC est sur 2 bits...
    Pour des éventuels tests, voici quelques exemples en hexa:
    01 02 00, doit retourner: 9F DE
    08 02 01 4F 00, doit retourner: 76 5E
    08 02 01 23 00, doit retourner: 76 73
    07 02 00, doit retourner: 9E 3E
    05 02 00, doit retourner: 5E 9F

    Merci d'avance.
    David.

  2. #2
    Membre averti Avatar de dacid
    Homme Profil pro
    Inscrit en
    Juin 2003
    Messages
    1 064
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 064
    Points : 420
    Points
    420
    Par défaut
    Heu....
    Ce tableau va peut-être vous être utile:

    static const WORD ccittrev_tbl[] = {
    0x0000, 0xC0C1, 0xC181, 0x0140, 0xC301, 0x03C0, 0x0280, 0xC241,
    0xC601, 0x06C0, 0x0780, 0xC741, 0x0500, 0xC5C1, 0xC481, 0x0440,
    0xCC01, 0x0CC0, 0x0D80, 0xCD41, 0x0F00, 0xCFC1, 0xCE81, 0x0E40,
    0x0A00, 0xCAC1, 0xCB81, 0x0B40, 0xC901, 0x09C0, 0x0880, 0xC841,
    0xD801, 0x18C0, 0x1980, 0xD941, 0x1B00, 0xDBC1, 0xDA81, 0x1A40,
    0x1E00, 0xDEC1, 0xDF81, 0x1F40, 0xDD01, 0x1DC0, 0x1C80, 0xDC41,
    0x1400, 0xD4C1, 0xD581, 0x1540, 0xD701, 0x17C0, 0x1680, 0xD641,
    0xD201, 0x12C0, 0x1380, 0xD341, 0x1100, 0xD1C1, 0xD081, 0x1040,
    0xF001, 0x30C0, 0x3180, 0xF141, 0x3300, 0xF3C1, 0xF281, 0x3240,
    0x3600, 0xF6C1, 0xF781, 0x3740, 0xF501, 0x35C0, 0x3480, 0xF441,
    0x3C00, 0xFCC1, 0xFD81, 0x3D40, 0xFF01, 0x3FC0, 0x3E80, 0xFE41,
    0xFA01, 0x3AC0, 0x3B80, 0xFB41, 0x3900, 0xF9C1, 0xF881, 0x3840,
    0x2800, 0xE8C1, 0xE981, 0x2940, 0xEB01, 0x2BC0, 0x2A80, 0xEA41,
    0xEE01, 0x2EC0, 0x2F80, 0xEF41, 0x2D00, 0xEDC1, 0xEC81, 0x2C40,
    0xE401, 0x24C0, 0x2580, 0xE541, 0x2700, 0xE7C1, 0xE681, 0x2640,
    0x2200, 0xE2C1, 0xE381, 0x2340, 0xE101, 0x21C0, 0x2080, 0xE041,
    0xA001, 0x60C0, 0x6180, 0xA141, 0x6300, 0xA3C1, 0xA281, 0x6240,
    0x6600, 0xA6C1, 0xA781, 0x6740, 0xA501, 0x65C0, 0x6480, 0xA441,
    0x6C00, 0xACC1, 0xAD81, 0x6D40, 0xAF01, 0x6FC0, 0x6E80, 0xAE41,
    0xAA01, 0x6AC0, 0x6B80, 0xAB41, 0x6900, 0xA9C1, 0xA881, 0x6840,
    0x7800, 0xB8C1, 0xB981, 0x7940, 0xBB01, 0x7BC0, 0x7A80, 0xBA41,
    0xBE01, 0x7EC0, 0x7F80, 0xBF41, 0x7D00, 0xBDC1, 0xBC81, 0x7C40,
    0xB401, 0x74C0, 0x7580, 0xB541, 0x7700, 0xB7C1, 0xB681, 0x7640,
    0x7200, 0xB2C1, 0xB381, 0x7340, 0xB101, 0x71C0, 0x7080, 0xB041,
    0x5000, 0x90C1, 0x9181, 0x5140, 0x9301, 0x53C0, 0x5280, 0x9241,
    0x9601, 0x56C0, 0x5780, 0x9741, 0x5500, 0x95C1, 0x9481, 0x5440,
    0x9C01, 0x5CC0, 0x5D80, 0x9D41, 0x5F00, 0x9FC1, 0x9E81, 0x5E40,
    0x5A00, 0x9AC1, 0x9B81, 0x5B40, 0x9901, 0x59C0, 0x5880, 0x9841,
    0x8801, 0x48C0, 0x4980, 0x8941, 0x4B00, 0x8BC1, 0x8A81, 0x4A40,
    0x4E00, 0x8EC1, 0x8F81, 0x4F40, 0x8D01, 0x4DC0, 0x4C80, 0x8C41,
    0x4400, 0x84C1, 0x8581, 0x4540, 0x8701, 0x47C0, 0x4680, 0x8641,
    0x8201, 0x42C0, 0x4380, 0x8341, 0x4100, 0x81C1, 0x8081, 0x4040
    };
    David.

  3. #3
    Membre expérimenté
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Points : 1 664
    Points
    1 664
    Par défaut
    Tu devrais d'abord te renseigner sur les CRC puis sur les bitwise operators. Apres, cela devrait couler de source.

  4. #4
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Points : 11 625
    Points
    11 625
    Par défaut
    Rapidement parce que je commence à avoir faim. La partie qui fait tout le boulot :
    Citation Envoyé par dacid
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    	while (len--){
    		chksum.w = chksum.b.hi ^ (ccittrev_tbl[chksum.b.lo ^ *msgchk++]);
    	}
    	chksum.w = ~chksum.w;
    En gros ça revient à faire pour chaque corractère de la chaine msg :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mot = byte_de_poid_fort_de_mot XOR ccittrev_tbl[indice]
    Avec mot valant 0xFFFF pour le premier caractère de la chaine
    Et indice égale à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    byte_de_poid_faible_de_mot XOR nième_caractère_de la_chaine
    Une fois que l'on a parcouru toute la chaine, on inverse les bites du mot obtenu (opérateur NOT).

    Je sais je suis nul en algo, j'espère avoir été claire

  5. #5
    Membre averti Avatar de dacid
    Homme Profil pro
    Inscrit en
    Juin 2003
    Messages
    1 064
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 064
    Points : 420
    Points
    420
    Par défaut
    Bonjour gege2061 et DaZumba,
    Merci pour vos indications....

    J'ai essayé de faire ça à la main et il y a un pépin:

    Pour: 01 02 00

    // Premier element
    mot = FFFF
    ind = FF XOR 01 // = FE = 254
    mot = FF XOR [ind] // = FF XOR 0x8081 = 807E

    // Deuxième element
    mot = 807E
    ind = 7E XOR 02 // = 7C = 124
    mot = 80 XOR [ind] // = 80 XOR 0x2200 = 2280

    // Troisième element
    mot = 2280
    ind = 80 XOR 00 // = 80 = 128
    mot = 22 XOR [ind] // = 22 XOR 0xE101 = E123

    NOT E123 = FFFFFFFFFFFF1EDC (au lieu de 9FDE)

    Ou est ce qu'il y a un truc qui m'a échappé ?
    David.

  6. #6
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Points : 11 625
    Points
    11 625
    Par défaut
    Le code donne le bon résultat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    ind = 254
    mot = 0x807e
     
    ind = 124
    mot = 0xe181
     
    ind = 129
    mot = 0x6021
     
    ffff9fde

  7. #7
    Membre averti Avatar de dacid
    Homme Profil pro
    Inscrit en
    Juin 2003
    Messages
    1 064
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 064
    Points : 420
    Points
    420
    Par défaut
    En effet, je me suis trompé à piocher dans le tablea...

    Voici le détail:

    Pour: 01 02 00

    // Premier element
    mot = FFFF
    ind = FF XOR 01 // = FE = 254
    mot = FF XOR [ind] // = FF XOR 0x8081 = 807E

    // Deuxième element
    mot = 807E
    ind = 7E XOR 02 // = 7C = 124
    mot = 80 XOR [ind] // = 80 XOR 0xE101 = E181

    // Troisième element
    mot = E181
    ind = 81 XOR 00 // = 81 = 129
    mot = E1 XOR [ind] // = 22 XOR 0x60C0 = 6021

    NOT 6021 = FFFFFFFFFFFF9FDE, donc 9FDE sur 2 bits.

    FASTOCHE !!!

    Merci encore !
    David.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Débutant]Comment exécuter une fonction tous les jours
    Par pseudomh dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 21/06/2006, 16h10
  2. [Débutant] Suppresion d'une fonction Oracle 9.i
    Par snoopy69 dans le forum Oracle
    Réponses: 2
    Dernier message: 12/06/2006, 15h14
  3. [débutant] erreur dans une fonction
    Par Skizo dans le forum Access
    Réponses: 7
    Dernier message: 18/05/2006, 10h46
  4. [C#][Débutant] Comment faire une fonction FindWindow ?
    Par Cazaux-Moutou-Philippe dans le forum Windows Forms
    Réponses: 4
    Dernier message: 27/04/2006, 13h19
  5. [Débutant] Déclarer, utiliser une fonction
    Par Hokagge dans le forum Langage
    Réponses: 7
    Dernier message: 14/03/2006, 08h03

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