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

Pascal Discussion :

Lire un fichier binaire


Sujet :

Pascal

  1. #1
    Candidat au Club
    Inscrit en
    Octobre 2006
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 2
    Points : 2
    Points
    2
    Par défaut Lire un fichier binaire
    Bonjour,

    Je suis étudiante en 3eme cycle. Pour mes expériences, j'utilise un logiciel d'acquisition de données qui enregistre les données mesurées en mode binaire.

    Les fichiers générés sont organisés de la façon suivante : un identificateur codé en 8 bit indiquant la nature des données qui vont suivre (mesure type1, mesure type2, message texte etc.) suivi par une série de valeurs - chacune d’entre elles occupant un nombre fixe de bits en fonction de leurs longueurs respectives (exemple distance 4 bits, hauteur 2 bits etc..).

    Afin de faire des analyses personnalisées, je souhaiterais écrire un petit programme en Delphi 4 qui exporte les donnes en ASCII : le programme ouvre le fichier de données en mode binaire en lecture seule, cherche l’identificateur 42 et lit la série de valeurs suivant cet indicateur.

    Je n’ai pas encore programmé ce genre de procédure. Je cherche donc une personne qui pourrait m’aider à démarrer en m’indiquant comment lire un fichier en mode binaire, chercher dans le fichier l’ID 42 et en suite lire par blocs de bits les valeurs enregistrées

    Merci beaucoup pour votre aide

  2. #2
    ALT
    ALT est déconnecté
    Membre émérite
    Avatar de ALT
    Homme Profil pro
    Retraité
    Inscrit en
    Octobre 2002
    Messages
    1 274
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 274
    Points : 2 477
    Points
    2 477
    Par défaut
    Il suffit d'utiliser un type enregistrement ("record").
    Ceci dit, il n'existe pas de type de données sur un ou deux bits.
    Il te faudra utiliser un type entier sur 8, 16, 32 ou 64 bits puis réaliser un masque (ET sur le champ de bits. Par exemple, un entier n sur 8 bits, je veux le troisième & le quatrième en partant de la gauche. Ils ont donc pour valeur 16 & 32. 16+32=48. Donc tu fais n and 48, puis tu traites en fonction du résultat).
    Pour le reste, il te faut adapter ton enregistrement en fonction de tes contraintes : si les lignes ont des tailles variables, il te faudra déterminer quelle est leur longueur en fonction de quel critère, puis utiliser le bon enregistrement en fonction de ce critère.

    Hum !
    Un poil compliqué, non ?

  3. #3
    Membre éclairé
    Inscrit en
    Juin 2005
    Messages
    644
    Détails du profil
    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2005
    Messages : 644
    Points : 754
    Points
    754
    Par défaut
    Si on souhaite acceder aux bits 'directement', on peut utiliser un compilateur C et les champs de bits. Ceci etant, le record en pascal va tres bien (si le nombre de bits par structure est un multiple de 8!) :
    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
     
    const n_b                 = 10; // ici mettre la valeurs 'adaptée'
          fields              = 20; // ici mettre la valeur adaptée
          Mon_Identificateur  = 42;
          FileName            = 'mon_fichier.bin';      // par exemple
          Field_length : array[1..fields] of byte =
            (
            4,6,  // les n_b bytes de datas  sont à considérer comme
            2,4,  // 20 champs de Fileds_Length[i] bits
            4,3,  // bien entendu, somme( Nbr bits = 10*8 = 80 )
            5,4,  // l'eploitation + loin est possible que si les champs ont 63 bits ou -
            4,4,
            7,1,
            4,5,
            4,4,
            4,3,
            4,4
            );
    type ma_struct =
    record
       Header : byte;   // 8 bits
       datas : array[1..n_b] of byte;
       end;
    var f : file; V : ma_struct; n_items, n_items_type_42 : integer;
    procedure TForm1.Button1Click(Sender: TObject);
    var p     : pointer;
        i,j,k : integer;
        s_01,s: string;
        b     : byte;
        Dt  : array[1..fields] of longword;
    begin
    n_items:=0;
    n_items_type_42:=0;
    if not Fileexists(FileName ) then
       begin
       ShowMessage('Désolé mais le fichier ' + FileName + '  n''est pas présent');
       exit;
       end;
    assignfile(f,FileName);
    reset(f,1);
    if filesize(f) mod sizeof(V) <> 0 then
       begin
       closefile(f);
       ShowMessage('Désolé mais le fichier ' + FileName + '  n''est pas de taille correcte');
       exit;
       end;
    while not eof(f) do
       begin
       blockread(f,v,sizeof(V));
       with v do
          begin
          inc(n_items);
          if Header = Mon_Identificateur then
             begin
             inc(n_items_type_42);
             p:=@V.datas;
             s_01:='';
             for i:= 1 to (n_b shl 3) do s_01:= s_01 + ' '; // 80 espaces
             j:=0;
             for i:=1 to n_b do
                begin
                b:=datas[i];
                for k:=1 to 8 do
                   begin
                   if ( b and 1) = 1 then s_01[j+9-k]:='1' else s_01[j+9-k]:='0';
                   b:= b shr 1;
                   end;
                inc(j,8);
                end;
             end;
          for i:=1 to fields do
             begin
             s:= copy(s_01,1,Field_length[i]);
             Dt[i]:=0;
             for k:=1 to length(s) do
                begin
                Dt[i]:=Dt[i] shl 1;
                if s[1]='1' then inc(Dt[i]);
                delete(s,1,1);
                end;
             delete(s_01,1,Field_length[i]);
             end;
          end;
       end;
    closefile(f);
    end;

  4. #4
    Candidat au Club
    Inscrit en
    Octobre 2006
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 2
    Points : 2
    Points
    2
    Par défaut Merci Beaucoup
    Merci beaucoup pour ce code . Je pense que je vais m'ensortir avec tout ces elements.

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

Discussions similaires

  1. Comment bien lire un fichier binaire ?
    Par domiq44 dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 12/01/2007, 09h38
  2. comment lire des fichiers binaires
    Par compton dans le forum Autres Logiciels
    Réponses: 8
    Dernier message: 06/07/2006, 13h03
  3. [C#] Lire un fichier binaire
    Par LE NEINDRE dans le forum Windows Forms
    Réponses: 1
    Dernier message: 02/06/2006, 19h08
  4. lire un fichier binaire 8bit apr 8bit
    Par lykim dans le forum Entrée/Sortie
    Réponses: 21
    Dernier message: 12/05/2006, 18h09
  5. [NIO]Lire un fichier binaire
    Par Info-Rital dans le forum Entrée/Sortie
    Réponses: 3
    Dernier message: 25/07/2005, 08h50

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