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
    }

  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 629
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 629
    Points : 30 692
    Points
    30 692
    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

  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