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 :

Decodage de données binaires


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Mars 2009
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 43
    Par défaut Decodage de données binaires
    Bonjour, à tous !

    Mes connaissances en programmation se limitant à ce que j'ai pu apprendre lors de ma scolarité, j'espère ne choquer personne avec mes questions ^^ !. J'éspère aussi poster au bon endroit !

    Voila je vous explique mon problème, j'ai écrit un petit bout de code maladroit qui mélange C et C++ (cela doit être affreux pour un programmeur confirmé mais le résultat est fonctionnel) qui a mon gout prend beaucoup de temps pour s'exécuter.

    Le but de ce programme est de lire un fichier binaire qui contient un enregistrement de la communication numérique (ARINC) d'un équipement aéronautique.

    Pour lire le fichier binaire pas de soucis cela se fait assez rapidement, le problème se situe au niveau du décodage des trames ARINC enregistrées, opération qui prend le plus de temps dans mon code.

    Le fichier binaire contient en fait des succession de paquets de 9 octets : 5 octets contenant une info temporelle et 4 octets contenant le mot ARINC reçu.

    Pour ce faire je lis l'ensemble des paquets de 9 octets et je les stockent un à un dans une liste chainée que je parcours ensuite pour les décoder, le résultats du décodage est stocké a son tour dans une structure qui est elle même stockée dans une autre liste chainée de structure ().

    Le decodage consiste pour les 4 octets du mot ARINC a decomposer les 32 bits en différente parties pour obtenir les informations qu'il contient.Pour ce qui est de l'info temporelle les 5 octects contiennent sous forme binaire Heures;Minutes;Secondes et Microsecondes (8 bits pour les H, 6 pour les minutes, 6 pour les secondes et 20 pour les µsecondes)

    Pour l'instant je me débrouille avec des divisions et des soustractions pour extraire les parties désirées du mot ou de l'info temporelle. De plus j'ai besoins d'afficher l'info temporelle sous la forme seconde.µsecondes ( H*3600+60*M+S+(µS/1000000)), ce calcul doit etre gourmand en temps je pense.

    Ce projet étant lié a mon travail, je ne peut pas tout le temps rentrer dans le détail. Ma question se limite au problème de temps de calcul pour décoder les mots, si quelqu'un à une idée je lui en serait très reconnaissant.

    Je peut donner plus d'infos dans un message privé (surtout que tout cela doit vous paraitre brouillon mais j'ai du mal à tout expliquer de manière succincte) et même vous fournir mon code si cela peut aider.

    D'avance merci .

  2. #2
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Tu stockes tes enregistrements bruts de 9 octets dans une liste chainée ==> OK

    Par contre, je ne vois pas l'intérêt de stocker le résultat du décodage dans une autre liste chainée.

    Cela t'oblige à décoder tous tes enregistrements bruts (effectivement, si tu en as beaucoup, cela peut prendre du temps) et surtout à stocker en mémoire une intreprétation de ce que tu as déjà. De plus, même si tu n'est pas intéressé par les 100 premiers (ou derniers, peut importe) enregistrements, tu calcule quand même leur représentation et tu stockes cette représentation en mémoire, quel gachis (je trouve).

    Pourquoi ne pas calculer l'interprétation de ces résultats bruts que lorsque tu en as réellement besoin et ce n'est même pas la peine de la sauvegarder car d'après ce que tu montres, le temps de recalcul semble très rapide. Dans le calcul que tu as décrit, il n'y a rien de long (sauf si c'est répété quelques milliers de fois pour rien )
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  3. #3
    Membre averti
    Inscrit en
    Mars 2009
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 43
    Par défaut
    En fait je n'ai pas tout dit ! je stocke les informations décodées dans une liste car d'autres opérations sont réalisées ensuite ! en effet je dois faire des tests sur les infos décodées, par exemple pour l'ARINC chaque donnée est identifiée par un numéro de label (en octal sur 8 bits) et une transmission est une succession de labels qui doivent arriver dans un certain ordre et je teste cet ordre pour voire si on a pas perdus des billes en cours de route !. Au final je crée aussi un fichier csv qui contient les infos décodées, ce fichier n'est ni plus ni moins que les élément de ma liste chainée mis bout a bout (et donc dans l'ordre de récéption).

    Je me sert aussi de la STL pour avoir des outil de comparaison entre listes pour faire les tests.

    Certes le calcul cité ne doit pas être long mais pour certain enregistrements le nombre de mots reçu est important, par exemple pour 5 minutes on peut atteindre 900000 mots !

    J'ai aussi essayé la méthode lecture->décodage->stockage dans une même boucle mais le résultats est identique au niveau timing .

  4. #4
    Membre expérimenté Avatar de Nogane
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    241
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 241
    Par défaut
    Bonsoir,
    La lecture du fichier peut être longue si tu fait des lectures successive de 9 octets par 9 octets, sans buffer.
    Si c'est ce que tu fait, essai avec un filebuf, sinon ben j'ai pas d'autre idée...

  5. #5
    Membre averti
    Inscrit en
    Mars 2009
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 43
    Par défaut
    La lecture du fichier est deja "bufferisée" et est deja très rapide ! c'est l'enchainement des décodages qui est la plus longue (peut etre n'existe t il pas de solution )

  6. #6
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Bonjour,
    As-tu fais un bench pour voir exactement quelles étaient les étapes les plus gourmandes ? Sinon toute recherche d'optimisation peut te faire aller dans des directions peu rentables ou contre-productives...
    Dans ce que je comprend de ton exposé :
    1/ Lecture du fichier: OK
    2/ Pour tout mes enregistrement :
    2.1 Decoder Enregistrement
    2.1.1 Decoder Temps
    2.1.2 Decoder Mot
    2.2 Ajouter à la liste des Enregistrements décodées.

    Qu'est-ce qui est gourmand : 2.1.1, 2.1.2 ou 2.2 ou tous ?

    Citation Envoyé par Darki03
    Pour l'instant je me débrouille avec des divisions et des soustractions pour extraire les parties désirées du mot ou de l'info temporelle.
    Des masques et des décalages ?
    Citation Envoyé par Darki03
    De plus j'ai besoins d'afficher l'info temporelle sous la forme seconde.µsecondes ( H*3600+60*M+S+(µS/1000000)), ce calcul doit etre gourmand en temps je pense.
    Le calcul n'est pas forcément ce qui te prendra plus le temps. La question peut plutôt se poser en ces termes : A l'affichage, tu ne vas probablement afficher qu'un faible nombre d'enregistrement sur l'écran (le nombre de ligne d'un écran étant limité). Peut-être ne faut-il faire cette transformation qu'à ce moment (d'autant si tu as un composant d'affichage 'intelligent' type liste virtuelle).

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

Discussions similaires

  1. [xml] Encapsulation de données binaires
    Par yanoche dans le forum XML/XSL et SOAP
    Réponses: 4
    Dernier message: 30/11/2005, 14h32
  2. [MySQL] Données binaires
    Par GregPeck dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 12/11/2005, 23h40
  3. Manipulation de données binaires
    Par Defre87 dans le forum Général Python
    Réponses: 3
    Dernier message: 28/09/2005, 16h16
  4. Problème avec les données binaire
    Par Lachessis dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 10/08/2005, 17h38
  5. Données ASCII et données binaires
    Par chourmo dans le forum Langage
    Réponses: 2
    Dernier message: 20/06/2005, 12h19

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