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++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    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
    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 chevronné 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
    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 éclairé
    Inscrit en
    Mai 2005
    Messages
    73
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 73
    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 averti
    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
    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 averti
    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
    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
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    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 confirmé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 38
    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 averti
    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
    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 confirmé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 38
    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 confirmé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

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

  11. #11
    Membre averti
    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
    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

+ 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