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 :

Décodage d'un fichier texte


Sujet :

C

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 5
    Points : 5
    Points
    5
    Par défaut Décodage d'un fichier texte
    Bonjour,
    Je souheterai procéder, en langage C, à la lecture d'un fichier srecord (fichier de programmation flash dans mon cas) pour sauvegarder succésivement toutes les données dans un tableau.

    Le fichier est composé de lignes de ce format:

    S319FFF0011460211000480000A1480000004C00012C3C6000000B

    S3 réprésente le format 4 bits pour l'adresse
    19 la taille nbre de bytes en hexa
    FFF00114 l'adresse
    A la fin 0B le checksum et tout le reste les datas.

    Je veux stocker ligne après ligne les datas dans un tableau.
    Chaque entier du tableau sera un entier 32 bits avec la data en hexa de la forme tab[0]=0x06211000, tab[1]=480000A1, .... avec la ligne précédente.

    J'ai regardé plusieurs exemples pour piloter un fichier txt mais je ne sais pas trop comment démarrer et je n'arrive pas découper et organiser mes données une fois que j'ai récupérer la ligne dans un string avec fgets (ce n'est peut-être pas la meilleure solution).

    merci d'avance

    Fred

  2. #2
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    Peux-tu confirmer que le fichier qui contient les données du genre
    S319FFF0011460211000480000A1480000004C00012C3C6000000B
    est bien un fichier texte et non un fichier binaire ?
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  3. #3
    Membre expérimenté
    Profil pro
    Développeur en systèmes embarqués retraité
    Inscrit en
    Mars 2006
    Messages
    946
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2006
    Messages : 946
    Points : 1 351
    Points
    1 351
    Par défaut
    Salut,


    Ton fichier m'a tout l'air d'être un dérivé des fichiers IntelHex, je sais qu'il y a eu 2-3 dérivés dont celui de Motorola. Là, il semble que le début de ligne soit un 'S' au lieu du ':' d'intelhex. Ceci te sera utile. Le principe, (à part pour le premier caractère 'S') est de transformer une paire de caractères ascii en un mot de 8 bits par exemple la paire "FF" en un mot de 8 bits de valeur 0xff.

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 5
    Points : 5
    Points
    5
    Par défaut
    Effectivement, il s'agit bien d'un dérivé des fichiers Intel Hex, ce n'est pas vraiment un fichier texte, les valeurs sont des données en HEXA, mais selon moi pour y accèder je fais comme si c'était un fichier texte ? FILE * f = fopen ....

    C'est après pour lire et mettre en forme les données que je bloques un peu.

    Par quelle fonction je peux faire ce découpage 8 bits.

  5. #5
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    Stupide que je suis, c'est bien un fichier texte puisqu'on a un 'S' dedans !

    Je te propose de faire une fonction qui convertit n char du tableau tab en entier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #define MAXCHAR 8
    unsigned long conversion(char * tab, size_t n)
    {
      char t[MAXCHAR+1];
    //  Tester ici n par rapport à MAXCHAR si on veut être prudent
      strncpy(t,tab,n);          // pour extraire la chaîne à convertir
      t[n] = '\0';               // terminer la chaîne à convertir
      return strtoul(t,NULL,16); //conversion
    }
    puis, d'obtenir le nombre de valeurs à lire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    size_t NombreValeurs(char* rec)
    {
      return (conversion(rec+2,2)-4-1)/4;
      // rec+2 : début de la chaîne décrivant la longueur
      //-4 : adresse; -1 : checksum; /4 : 8 octets/valeur et 2 char par octet
    }
    Il ne reste plus qu'à assembler le tout.
    Si la ligne lue par fgets() est dans tab :

    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
    //char tab[]= "S319FFF0011460211000480000A1480000004C00012C3C6000000B\n";
    #define MAXVAL 20
    unsigned long tabval[MAXVAL]={0}; // stockage des valeurs
    size_t i, nb;
    char *p ;
    // tant qu'on n'est pas à la fin du fichier lire une ligne et la mettre dans tab
    // puis analyser la ligne :
       p = tab+12; //position de la première valeur
       nb = NombreValeurs(tab); // nombre de valeurs à lire
    //  Tester ici nb par rapport à MAXVAL ou dans la boucle for si on veut être prudent
       for(i=0 ; i<nb ; i++)
       {
         tabval[i] = conversion(p,8); // données sur 8 char
         p+= 8;
       }
    // et recommencer
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 5
    Points : 5
    Points
    5
    Par défaut
    Dans le principe, j'ai tout compris merci beaucoup pour ces bouts de code détaillés.

    Reste plus qu'à mettre en place et adapter un peu mais le gros du travail vous me l'avait fait...lol

    Merci encore, j'ai testé cet exemple ça marche très bien et je comprends que demander de mieux.

    @mitié
    Frédéric

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

Discussions similaires

  1. problème de lecture/décodage d'un fichier texte
    Par _vince_ dans le forum Général Python
    Réponses: 5
    Dernier message: 04/01/2012, 09h43
  2. lecture et décodage d'un fichier texte: Solution ou leurre?
    Par j.p.mignot dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 19/01/2008, 14h33
  3. [VB6] Ecrire/Modifier/Effacer ds un fichier text-4 Chs/Lg
    Par Jonathan_Korvitch dans le forum VB 6 et antérieur
    Réponses: 18
    Dernier message: 24/12/2002, 18h54
  4. Importer des fichiers textes délimités
    Par Invité dans le forum Outils
    Réponses: 2
    Dernier message: 23/09/2002, 13h56
  5. Instruction pour créer un fichier text ???
    Par Soulsurfer dans le forum Langage
    Réponses: 2
    Dernier message: 06/08/2002, 11h17

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