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 :

Calcul de Checksum


Sujet :

C++

  1. #1
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Australie

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2006
    Messages : 22
    Points : 16
    Points
    16
    Par défaut Calcul de Checksum
    Bonjour,

    je doit calcul le chk d'un tableau de BYTE.
    Ce chk ce calcule : chk = Xor body avec body = un certain nb d'octet selon la trame.

    un exemple pour la trame :
    84, 00, 00, 00, 1B, 83, 01, 00, 01, 09, 00, 00, 00, 05

    je doit obtenir chk = 8b

    j'ai essayer plusieur solution dont celle ci mais ca ne marche pas

    char chk = 0;

    for (int i = 1; i< nbByte; i++)
    {
    chk += (chk ^ m_Message[i]);
    }

    Merci

  2. #2
    Membre confirmé Avatar de themadmax
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    446
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 446
    Points : 496
    Points
    496
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for (int i = 1; i< nbByte; i++)
    {
        chk = (chk ^ m_Message[i]); //Il me semble que ton += est de trop
    }
    ________________________________________________
    http://bliquid.fr : Blog sur Android et l'Acer Liquid

  3. #3
    Membre du Club
    Inscrit en
    Mai 2005
    Messages
    73
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 73
    Points : 68
    Points
    68
    Par défaut
    D'autre part, est-ce normal que tu ne traites pas le premier élément de ton tableau (m_Message[0]) ?

  4. #4
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Australie

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2006
    Messages : 22
    Points : 16
    Points
    16
    Par défaut
    merci

    - je vais essayer sans le +=

    - je ne traite pas le premier carac car il ne fait pas parti du body c'est le carac de debut de trame (stx)

  5. #5
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Australie

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2006
    Messages : 22
    Points : 16
    Points
    16
    Par défaut
    sa ne marche pas non plus ni avec += ni avec = tous seul

    pour la trame 84, 0, 0, 0, 1B, 83, 1, 0, 1, 9, 0, 0, 0, 5

    je devrait avoir 0x8B de chk or j'ai 0x10 en utilisant

    for (int i = 1; i< nbByte; i++)
    {
    chk = (chk ^ m_Message[i]); //Il me semble que ton += est de trop
    }

  6. #6
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Salut,

    Il faudrait surement commencer par travailler sur tous les éléments de ton tableau...

    C'est à dire sur les élément m_Message[0] à m_Message[nbByte-1] inclu...

    Il y a de fortes chances que ton problème principal vienne, tout simplement, de mauvaises valeurs dans ta boucle...

    Et le tout, avec un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    chk = (chk ^ m_Message[i]);
    à moins que tu n'aie pas présenter l'intégralité de la spécification de ton check
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 38
    Points : 44
    Points
    44
    Par défaut
    Citation Envoyé par ktsys
    Bonjour,
    un exemple pour la trame :
    84, 00, 00, 00, 1B, 83, 01, 00, 01, 09, 00, 00, 00, 05
    je doit obtenir chk = 8b

    Merci
    Est-ce que tu es certain du résultat 8b, je rouve 94 ou alors je me suis trompé.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    #include <stdio.h>
     
    int main (int argc, char **argv)
    {
      char chk = 0;
      char  m_Message[] = {0x84, 00, 0, 0, 0x1B, 0x83, 1, 0, 1, 9, 0, 0, 0, 5};
      int nbByte = (sizeof(m_Message)/sizeof(m_Message[0]));
      for( int i = 1; i< nbByte; i++)
      {
        chk = (chk ^ m_Message[i]);
      }
      printf("chk = %02x\n",chk & 0xff);
    }

  8. #8
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Australie

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2006
    Messages : 22
    Points : 16
    Points
    16
    Par défaut
    je suis certain du rsl 8b c'est un exemple de la doc

    et dans la doc il ya a :

    Message Format :

    <message> = <STX><Body><chk><ETX>
    <chk> is the xor off all the byte in <Body>

    ya pas plus

    donc la trame est 2, 84, 0, 0, 0, 1B, 83, 1, 0, 1, 9, 0, 0, 0, 5, 8B, 3,

    avec 2 = ETX (donc je ne l'ai pas mit tout a l'heure et c'est pour sa que je ne traite pas le premier elem de mon tableau)
    8b = le fameux chk
    3 = STX (ne rentre pas en compte ds le chk)

    voila j'ai tourné le pb dans tous les sens impossible de trouver un rsl correct

    afec++ : vu que tu n'a pas STX il ne faut pas ignorer le 1er elem et pourquoi tu fait un print "chk &0xff" ?

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 38
    Points : 44
    Points
    44
    Par défaut
    Le 0xff sert à 'tronquer' l'entier à cause de l'extension du signe.

    Voici un autre bout de code qui prend en compte ta remarque mais je ne trouve toujours pas le bon résultat :
    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
     
    #include <iostream>
     
     
    int main (int argc, char **argv)
    {
      unsigned char trame[] = {2, 0x84, 0, 0, 0, 0x1B, 0x83, 1, 0, 1, 9, 0, 0, 0, 5, 0x8b, 3};
      const int debut = 1;
      const int fin = 14;
     
      unsigned char chk = trame[debut];
      for( int i = debut+1; i <= fin; i++)
      {
        chk ^= trame[i];
      }
      std::cout.setf(std::ios::showbase);
      std::cout << "chk = " << std::hex << int(chk) << std::endl;
    }

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 38
    Points : 44
    Points
    44
    Par défaut
    Quel protocole cherches tu à implémenter ?

  11. #11
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Australie

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2006
    Messages : 22
    Points : 16
    Points
    16
    Par défaut
    c'est un protocole un peu bateaux pour piloter un soundweb 9088iis (sa sert a faire des traitement sur le son gain, delay...)

    voila la doc si quelqu 'un y comprend plus que moi :

    http://www.bss.co.uk/soundweb/serial...kit/index.html

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 38
    Points : 44
    Points
    44
    Par défaut
    Le 'checksum' se fait sur le body brut avant substitution des caractères spéciaux.

    Dans ton buffer tu as peut être déjà fait la traduction du 3 en 1B 83 (c.f page 8 de la doc) qui doit se faire à la transmission après calcul du checksum ce qui donne (et ça retourne bien : 8b)

    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
     
    #include <iostream>
     
     
    int main (int argc, char **argv)
    {
      unsigned char trame[]   = {2, 0x84, 0, 0, 0, 3,                 1, 0, 1, 9, 0, 0, 0, 5, 0x8b, 3};
      //unsigned char trame[] = {2, 0x84, 0, 0, 0, 0x1B, 0x83, 1, 0, 1, 9, 0, 0, 0, 5, 0x8b, 3};
      const int debut = 1;
      const int fin = 13;
     
      unsigned char chk = 0;
      for( int i = debut; i <= fin; i++)
      {
        chk ^= trame[i];
      }
     
      std::cout.setf(std::ios::showbase);
      std::cout << "chk = " << std::hex << int(chk) << std::endl;
    }

  13. #13
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Australie

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2006
    Messages : 22
    Points : 16
    Points
    16
    Par défaut
    exact je calculer le chk av avoir remplacer les caracs spéciaux
    maintenant sa marche nikel

    merci en tout cas d'avoir cherché

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

Discussions similaires

  1. Calcul de checksum
    Par Carlito78 dans le forum Algorithmes et structures de données
    Réponses: 13
    Dernier message: 24/07/2009, 16h16
  2. Choix et calcul CRC, checksum,md5
    Par mercure07 dans le forum C++
    Réponses: 1
    Dernier message: 22/04/2008, 14h27
  3. calcul de checksum
    Par jerome86600 dans le forum Sécurité
    Réponses: 3
    Dernier message: 29/12/2007, 01h33
  4. 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, 10h46
  5. Calcul de checksum ?
    Par elitost dans le forum Windows
    Réponses: 14
    Dernier message: 21/01/2005, 13h29

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