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

MATLAB Discussion :

xor pour contrôle de checksum


Sujet :

MATLAB

  1. #1
    Membre éclairé Avatar de tubaas
    Homme Profil pro
    Acousticien
    Inscrit en
    Août 2009
    Messages
    641
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Acousticien
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2009
    Messages : 641
    Points : 825
    Points
    825
    Par défaut xor pour contrôle de checksum
    bonjour
    je cherche à faire un xor pour un calcul de checksum mais la fonction xor ne semble pas convenir.
    je m'explique : j'ai un certain nombres de nombres (décimaux que je peux éventuellement convertir) dont je veux vérifier la checksum dans un vecteur colonne.
    ex:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    readData =
     
       255
       240
         1
       255
       241
    (en fait ici ce sont les 4 premiers, le dernier étant la checksum).
    je ne trouve pas de façon correcte de l'effectuer (si je converti en binaire j'ia des chaines de caractères à reconvertir...), sachant que ça ne doit pas être impossible à faire puisque la calculatrice Windows le fait (je pense que c'est du xor bit à bit).
    merci

  2. #2
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 318
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 318
    Points : 52 953
    Points
    52 953
    Par défaut
    Tu peux nous rappeler l'algorithme du checksum ?

  3. #3
    Membre éclairé Avatar de tubaas
    Homme Profil pro
    Acousticien
    Inscrit en
    Août 2009
    Messages
    641
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Acousticien
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2009
    Messages : 641
    Points : 825
    Points
    825
    Par défaut
    en fait je ne suis pas sûr.
    on m'a dit xor (ou exclusif) et montré en hexa sur la calculette windows.
    je pense que c'est un xor bit à bit.
    une conversion en binaire s'imposerait alors.
    j'ai oublié de préciser que chacun de mes nombres en décimal représente en fait un octet.
    le xor :
    a b xor
    0 0 0
    0 1 1
    1 0 1
    1 1 0
    en fait ce serait de la parité pour chaque bit en quelque sorte en prenant sur plusieurs octets
    je viens de penser en rédigeant ce message que j'étais bête car si je m'intéressais à la vérification du checksum qui manquait dans mon code, la construction y était faite.
    voici la solution ou msg correspond à mon readData
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
        checksum_dec = 0;
     
        for i = 1:length(msg)
            checksum_dec = bitxor(checksum_dec,msg(i));
        end
     
        checksum = dec2hex(checksum_dec,2);
    C'était donc la fonction BITXOR qu'il me fallait.
    je l'avais vu mais n'avait pas compris qu'elle était adaptée à mon problème
    merci en tout cas et si vous avez un moyen d'enlever la vilaine boucle

  4. #4
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 318
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 318
    Points : 52 953
    Points
    52 953
    Par défaut
    Quel est le problème avec la boucle ?

    Si ce n'est qu'il me semble que tu peux faire une itération en moins :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    checksum_dec = msg(1);
     
        for i = 2:length(msg)
            checksum_dec = bitxor(checksum_dec,msg(i));
        end

  5. #5
    Membre éclairé Avatar de tubaas
    Homme Profil pro
    Acousticien
    Inscrit en
    Août 2009
    Messages
    641
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Acousticien
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2009
    Messages : 641
    Points : 825
    Points
    825
    Par défaut
    merci
    non aucun problème mais j'aurais aimé le faire tenir en une ligne avec un simple if (verif_checksum), et comme je vois arfois des solutions étonemment élégante sur le forumj, je me disais que s'il y avait une façon de fair eque je ne connaissais pas, elle était bonne à prendre.
    il faut quand même que je vérifie les temps d'exécution (qui ne devraient cependant pas être rédhibitoire) car à cet endroit la vitesse d'exécution est critique.

  6. #6
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 318
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 318
    Points : 52 953
    Points
    52 953
    Par défaut
    Un petit C-MEX vite fait :

    Code C : 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
    #include "mex.h"
     
    void mexFunction(
        int nlhs, mxArray *plhs[],
        int nrhs, const mxArray *prhs[])
    {
     
        double *msg;
        unsigned int *checksum;
        mwSize nb, i, dims[2] = {1,1};
     
        msg = mxGetPr(prhs[0]);
        nb = mxGetNumberOfElements(prhs[0]);
     
        plhs[0] = mxCreateNumericArray(2,dims,mxUINT8_CLASS,mxREAL); 
        checksum = mxGetData(plhs[0]);
     
        for(i=0; i<nb; i++)
            checksum[0] = checksum[0]^(int)msg[i];
     
    }
    C'est juste l'idée de base...

  7. #7
    Membre éclairé Avatar de tubaas
    Homme Profil pro
    Acousticien
    Inscrit en
    Août 2009
    Messages
    641
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Acousticien
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2009
    Messages : 641
    Points : 825
    Points
    825
    Par défaut
    je n'avais pas penser aux MEX-FILES
    bonne idée à tester dès qu'un peu de temps se libère .

  8. #8
    Membre éclairé Avatar de tubaas
    Homme Profil pro
    Acousticien
    Inscrit en
    Août 2009
    Messages
    641
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Acousticien
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2009
    Messages : 641
    Points : 825
    Points
    825
    Par défaut
    Quelle modestie !
    Citation Envoyé par Dut Voir le message
    Un petit C-MEX vite fait :
    ...C'est juste l'idée de base...
    le code a l'air de faire exactement ce qui est prévu (je ne peux le tester plus avant) et avec des résultats que je pense meilleurs... si quelqu'un peut m'expliquer cequi suit (l'ordre des instructions change complètement leur temps d'exécution, peut-être un accès à la variable plus rapide la seconde fois ?)
    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
    79
    a=[25;251;54;23;125;6;9;12;5;6;78];
    b=[255;240;01;255;241];
    tic
    checksum(a);
    tCa=toc
    tic
    checksum(b);
    tCb=toc
    tic
    checksum_dec_a = a(1); 
        for i = 2:length(a)
            checksum_dec_a = bitxor(checksum_dec_a,a(i));
        end
    tMa=toc
    tic
    checksum_dec_b = b(1); 
        for i = 2:length(b)
            checksum_dec_b = bitxor(checksum_dec_b,b(i));
        end
    tMb=toc
     
    tCa =
     
        0.0176
     
     
    tCb =
     
        0.0126
     
     
    tMa =
     
        0.0063
     
     
    tMb =
     
        0.0082
     
    >> a=[25;251;54;23;125;6;9;12;5;6;78];
    b=[255;240;01;255;241];
    tic
    checksum_dec_a = a(1); 
        for i = 2:length(a)
            checksum_dec_a = bitxor(checksum_dec_a,a(i));
        end
    tMa=toc
    tic
    checksum_dec_b = b(1); 
        for i = 2:length(b)
            checksum_dec_b = bitxor(checksum_dec_b,b(i));
        end
    tMb=toc
    tic
    checksum(a);
    tCa=toc
    tic
    checksum(b);
    tCb=toc
     
    tMa =
     
        0.0328
     
     
    tMb =
     
        0.0247
     
     
    tCa =
     
        0.0035
     
     
    tCb =
     
        0.0035
    edit : j'ai compilé le code donné par DUT que j'avais enregistré sous checksum.c

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 24/03/2009, 12h37
  2. Réponses: 12
    Dernier message: 14/12/2008, 13h17
  3. Extraction de caractères pour contrôle des minutes!
    Par js8bleu dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 08/07/2008, 00h30
  4. [RegEx] expression regulière pour contrôle d'adresse mail
    Par zit_zit dans le forum Langage
    Réponses: 4
    Dernier message: 02/04/2007, 13h03
  5. Recherche d'un algorithme pour calculer un Checksum
    Par noune40 dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 23/11/2006, 11h46

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