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

 Delphi Discussion :

Extraction d'une chaîne dans un file non typé


Sujet :

Delphi

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2010
    Messages : 18
    Points : 20
    Points
    20
    Par défaut Extraction d'une chaîne dans un file non typé
    Bonjour !

    Avec D7 Pro, je manipule des fichiers destinés à être imprimés;
    Et aujourd'hui, je suis bloqué dans la manipulation d'un fichier non typé, en EBCDIC
    duquel j'extrait le code OMR pour statistiques ultérieures.

    Le code OMR débute par la chaîne unique 2B D3 04 D2 01 C5, suivie des 13 signes OMR et terminé par 5A



    Pouvez-vous m'aider dès la ligne 28 de mon code :

    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
    procedure TForm1.Lecture_Et_Test;
     
    var
      NumRead, NumWritten: Integer;
      Buf: array[1..2048] of Char;
     
    Begin
      Form1.ProgressBar1.Min := 1;
      Form1.ProgressBar1.Max := 1000;
      Form1.ProgressBar1.Step := 1;
      Form1.ProgressBar1.Position := Form1.ProgressBar1.Min ;
     
      F_Input  := '\\Ocetool3\DATA (D)\SERVER\Essai\'+Msk_Input.Text;
      AssignFile(FromF, F_Input);
      Reset(FromF, 1);	{ Taille d'enregistrement = 1 }
     
      F_Output := '\\Ocetool3\DATA (D)\SERVER\Essai\OMR_'+Msk_Input.Text;
      AssignFile(ToF, F_Output);	{ Ouverture du fichier de sortie }
      Rewrite(ToF, 1);	{ Taille d'enregistrement = 1 }
      Canvas.TextOut(48, 190, 'Copie de ' + IntToStr(FileSize(FromF)) + ' octets...');
     
      repeat
        BlockRead(FromF, Buf, SizeOf(Buf), NumRead);
     
        // Recherche du bloc de début unique: 2B D3 04 D2 01 C5   (EBCDIC)
        // et extraction des 13 signes OMR qui suivent, 
        // p.ex. BB 04 BB BB 40 40 40 40 40 40 BB 40 BB
        //          ]      ]   ]    (40 = space)       ]       ]
        // ce bloc se termine par 5A
     
        { SOS ici ! }
     
        BlockWrite(ToF, Buf, NumRead, NumWritten);
        Self.ProgressBar1.StepIt;
      until (NumRead = 0) or (NumWritten <> NumRead);
      CloseFile(FromF);
      CloseFile(ToF);
    Fichiers attachés Fichiers attachés

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 459
    Points : 24 873
    Points
    24 873
    Par défaut
    Tu peux utiliser un record et un transtype pour découper le buffer !

    comment chercher une valeur hex dans un fichier binaire "file of byte"

    Tu as plein d'exemple sur le forum sur la lecture binaire et hexadécimal ... tu y trouveras des réponses dont les miennes !
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 695
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 695
    Points : 13 133
    Points
    13 133
    Par défaut
    Ou cette variante:

    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
    procedure TForm1.Button1Click(Sender: TObject);
    type
      TReadMode = (rmSearch, rmRead);
     
    const
      StartString :array [0..5] of byte = ($2b, $d3, $04, $d2, $01, $c5);
      EndString   :byte = $5A;
     
    var
      msIN        :TMemoryStream;
      msOut       :TMemoryStream;
      StringIndex :integer;
      i           :Int64;
      b           :byte;
      Mode        :TReadMode;
     
    begin
      msIN  := TMemoryStream.Create;
      msOUT := TMemoryStream.Create;
     
      try
        msIN.LoadFromFile('c:\temp\qtra06.txt');
        msIN.Position := 0;
     
        //Index dans la chaîne de départ
        StringIndex := 0;
     
        //Mode "Recherche"
        Mode := rmSearch;
     
        for i := 0 to msIN.Size -1 do
        begin
          //Lecture byte par byte
          msIN.ReadBuffer(b, 1);
     
          case Mode of
            rmSearch: //Recherche de la chaîne de départ
                      if b = StartString[StringIndex] then
                      begin
                        //Tous les bytes testés -> Mode "Lecture"
                        if StringIndex = High(StartString)
                        then Mode := rmRead
                        else inc(StringIndex);
                      end
                      else StringIndex := 0;
     
            rmRead:   //Repasse en mode "Recherche" si caractère de fin trouvé
                      //Sinon écriture dans le flux de sortie
                      if b <> EndString then
                        msOUT.WriteBuffer(b, 1)
                      else
                      begin
                        Mode := rmSearch;
                        StringIndex := 0;
                      end;
          end;
        end;
     
        msOUT.SaveToFile('c:\temp\qtra06_OUT.txt');
     
      finally
        msIN.Free;
        msOUT.Free;
      end;
    end;
    A noter que ta chaîne de départ n'existe pas dans ton fichier d'exemple .

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2010
    Messages : 18
    Points : 20
    Points
    20
    Par défaut Merci à tous !
    Merci à tous pour votre aide !

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

Discussions similaires

  1. Recherche de chaîne dans un tampon non typé
    Par bvsud dans le forum Langage
    Réponses: 7
    Dernier message: 13/01/2010, 16h50
  2. Conseil sur l'extraction d'une string dans une string
    Par Mickey.jet dans le forum Delphi
    Réponses: 3
    Dernier message: 02/06/2006, 14h54
  3. Recuperation d'une chaîne dans un fichier
    Par black is beautiful dans le forum Windows
    Réponses: 3
    Dernier message: 20/03/2006, 18h57
  4. [DOM] agir sur le DOM au changement d'une chaîne dans un FORM
    Par boteha dans le forum Général JavaScript
    Réponses: 14
    Dernier message: 30/11/2005, 14h39
  5. Réponses: 5
    Dernier message: 21/07/2005, 19h20

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