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 :

SearchInBinaryFile Méthode de ShaiLeTroll


Sujet :

Delphi

  1. #1
    Nouveau membre du Club
    Inscrit en
    Janvier 2008
    Messages
    94
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 94
    Points : 34
    Points
    34
    Par défaut SearchInBinaryFile Méthode de ShaiLeTroll
    Bonjour à tous ,


    Suite à mon ancien code je voudrais l'ajourné et chercher des valeurs hexadécimales dans un BinaryFile et les afficher par la suite dans une listBox.


    Lorsque le fichier binaire est chargé , il lit dans un fichier Data.txt ces valeurs :

    Data.txt
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    922741D07A7877212F992740D07B7877
    23F37223F3DB70213A7B29F9D170213B

    Lorsque on lit ces valeurs on va procéder à les trouver dans le fichier binaire et les afficher dans notre ListBox.




    Etape 1: Ouvrir et lire le fichier binaire

    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
    function LireFichier(const Filename : string; Strs : TStrings): Boolean;
    var Buffer  : THexaLine;   { le buffer }
        Count,N : cardinal;    { compteur offset de ligne | taille du buffer }
        TSL     : TStringList; { tstringlist temporaire pour ne pas ecrire directement dans Strs }
        TFS     : TFileStream; { }
    begin
       ReadFile := False;
       TSL := nil; { on nilliize pour eviter les erreur de liberation }
       TFS := nil; { }
       try
         { on crée la stringlist et on place les offsets de colones }
         TSL := TStringList.Create;
     
     
     
         { on init count a 0 }
         count := 0;
     
         { si le fichier existe }
         if FileExists(FileName) then begin
            { on crée le stream et on ouvre le fichier en mode lecture seule }
            TFS := TFileStream.Create(FileName, fmOpenRead);
            { on se place au debut (inutile mais plus sur) }
            TFS.Seek(0,soFromBeginning);
            { boucle de lecture du fichier }
            repeat
              { on lit le buffer et on recupere la taille lue }
              N := TFS.Read(Buffer,SizeOf(Buffer));
              { on place le buffer dans une chaine qu'on ajoute dans la liste
                offset ligne (hex) | valeur hexa (hex) | caracteres (char) }
              TSL.Add( format(' %s',[HexaLineToStr(Buffer,N),HexaLineToChr(Buffer,N)] ) );
              { on incremente le compteur avec la taille N }
              inc(Count,N);
     
            { si le compteur est egale a la taille du stream (fin du fichier) on arrete la boucle }
            until count = TFS.Size;
     
            { on assigne les chaines de TSL a STRS }
            Strs.Assign(TSL);
     
            ReadFile := True;
         end;
     
       finally
         { on libere la liste temporaire et le stream }
         TFS.Free;
         TSL.Free;
       end;
    end;

    On l'affiche dans la listbox:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    LireFichier(OpenDialog1.FileName, ListBox1.Items);

    On lit du début du fichier:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     TFS.Seek(0,soBeginning);

    Méthode chercher valeur Hex de ShaiLeTroll:

    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
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    function SearchBinaryInFile(const FileName: string; const SearchBinary: TByteDynArray; out OffSets: TInt64DynArray; KeepOffSet: Boolean = False; Threshold: Integer = MaxInt; AcceptOverlap: Boolean = False): Integer;
    const
       BUF_SIZE: Integer = 1024;
       ZERO: Int64 = 0;
    var
       FileToSearch: Integer;
       FileLength, iReaded: Int64;
       SearchBuf: array of Byte;
       iSearchBufPos, iSearch, iMark, iCountFound, iRememberFound, iRememberOverlap: Integer;
       SearchLen: Integer;
       AmtTransferred: Integer;
       LastFound: Boolean;
       UpSearchString: string;
    begin
       SearchLen := Length(SearchBinary);
     
       Result := 0;
       if SearchLen <= 0 then
         Exit;
     
       SetLength(SearchBuf, BUF_SIZE);
       iReaded := 0;
     
       FileToSearch := FileOpen(FileName, fmOpenRead);
       if FileToSearch < 0 then
         Exit;
       try
          FileLength := FileSeek(FileToSearch, ZERO, FILE_END);
          FileSeek(FileToSearch, ZERO, FILE_BEGIN);
     
          iCountFound := 0;
     
          while iReaded < FileLength do
          begin
             AmtTransferred := FileRead(FileToSearch, SearchBuf[0], BUF_SIZE); // [0] parce que c'est un tableau dynamique
             iRememberFound := iCountFound;
             iRememberOverlap := iRememberFound;
             iSearchBufPos := 0;
             iSearch := 0;
             LastFound := False;
     
             while iSearchBufPos < AmtTransferred do
             begin
                // Comparaison Octet par Octet du Tableau d'Octet recherché
                for iMark := iCountFound to SearchLen - 1 do // -1 car type Dyn Array
                begin
                   iSearch := iSearchBufPos + iMark - iRememberFound;
                   if iSearch >= AmtTransferred then
                      Break;
     
                   if SearchBuf[iSearch] = SearchBinary[iMark] then
                   begin
                      Inc(iCountFound);
     
                      LastFound := iCountFound >= SearchLen;
                      if LastFound then
                      begin
                         Inc(Result);
     
                         if KeepOffSet then
                         begin
                            SetLength(OffSets, Length(OffSets) + 1);
                            if AcceptOverlap then
                              OffSets[High(OffSets)] := iReaded + iSearchBufPos - iRememberOverlap
                            else
                              OffSets[High(OffSets)] := iReaded + iSearchBufPos - iRememberFound;
                         end;
     
                         if iCountFound = Threshold then
                           Exit;
     
                         if AcceptOverlap then
                         begin
                           if iRememberOverlap = 0 then
                             Inc(iSearchBufPos, 1)
                           else
                             Dec(iRememberOverlap);
                         end
                         else
                           Inc(iSearchBufPos, SearchLen - iRememberFound);
     
                         iCountFound := 0;
                         iRememberFound := 0;
                         Break;
                      end;
                   end else begin
                      iCountFound := 0;
                      iRememberFound := 0;
                      Break;
                   end;
                end;
     
                if iSearch >= AmtTransferred then
                  Break;
     
                if LastFound then
                  LastFound := False
                else
                  Inc(iSearchBufPos, 1);
             end;
             Inc(iReaded, AmtTransferred);
          end;
       finally
          FileClose(FileToSearch);
       end;
    end;


    - On souhaite :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     * 1 : Charger un Fichier Binaire.
     * 2 : Trouver les valeurs recherchées , en lisant le fichier Data.txt.
     * 3: Afficher dans la ListBox QUE les valeurs recherchées .
     ( Dans notre cas c/est de chaines hexadécimales de 16 bytes chacune).



    Méthode modifiée de ShaiLeTroll pour trouver les valeurs recherchées:
    On souhaite chercher à valeurs indiquées dans le fichier Data.txt, ensuite on commence la recherche dans notre fichier BinaryFile.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SearchBinaryInFile(OpenDialog1.FileName,ListBox1.Items);
    J'ai essayé le code de ShaiLeTroll que je trouve simple est excellent , mais je n'arrive pas à l'adapter en fonction ce que je voudrais faire.
    Je joins le fichier binaire et Data.txt pour ceux qui voudrait faire juste un test.
    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 dois chercher la suite de valeur ?
    Une ligne correspondant à une recherche, rien de plus simple

    utilise HexToBin pour convertir ta chaine de 32 caractères issus de Data.Txt en un buffer de 16 octets (array of byte) utilisable par SearchBinaryInFile

    Regarde sur le forum, je crois avoir déjà donner le code pour exactement ta demande (juste convertir Binaire en Hexa et reciproquement)
    Je crois que me que c'est dans Sauvegarder les Items d'une TListBox dont Marley_T est l'auteur en 2008, oh ben c'est toi
    Hihi, code dans l'historique de modification sujet, mais faut le laisser ferrer le poisson !

    Le plus optimisé serait de faire une SearchBinariesInFile acceptant un array of TByteDynArray, ainsi le fichier ne serait lu qu'une fois mais l'algo de gestion du overlap et des mots étalés sur deux buffers seraient plus tortueuses !


    Plus le fichier est grand et plus il contient la valeur, plus OffSets s'agrandi en D7, le SetLength est très couteux, avec FastMM ou 2007, ça sera plus performant

    Bon, ce code passe de D5 à D2007, après ça doit être plus délicat !
    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
    Nouveau membre du Club
    Inscrit en
    Janvier 2008
    Messages
    94
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 94
    Points : 34
    Points
    34
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message
    tu dois chercher la suite de valeur ?
    Une ligne correspondant à une recherche, rien de plus simple


    Oui , tout à fait et l'afficher dans la listeBox.

    utilise HexToBin pour convertir ta chaine de 32 caractères issus de Data.Txt en un buffer de 16 octets (array of byte) utilisable par SearchBinaryInFile
    Regarde sur le forum, je crois avoir déjà donner le code pour exactement ta demande (juste convertir Binaire en Hexa et reciproquement)
    Je crois que me que c'est dans Sauvegarder les Items d'une TListBox dont Marley_T est l'auteur en 2008, oh ben c'est toi

    Oui ,
    C'est moi , c'était en 2008 03 ans déjà , le temps passe tellement vite.

    Le plus optimisé serait de faire une SearchBinariesInFile acceptant un array of TByteDynArray, ainsi le fichier ne serait lu qu'une fois mais l'algo de gestion du overlap et des mots étalés sur deux buffers seraient plus tortueuses !

    Plus le fichier est grand et plus il contient la valeur, plus OffSets s'agrandi en D7, le SetLength est très couteux, avec FastMM ou 2007, ça sera plus performant

    Bon, ce code passe de D5 à D2007, après ça doit être plus délicat !

    Je vais le code sera ajourné en suivant tes conseils.





    Merci Shai ,je vais tester le code et donner le résultat .

  4. #4
    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
    Citation Envoyé par Marley_T Voir le message
    Merci Shai ,je vais tester le code et donner le résultat .
    Mais de rien, si tu regardes bien, je l'avais enlever de ma réponse, tu as de la chance, tu l'as choppé avant !
    Essaye de le comprendre et de le corriger avant de revenir trop vite !
    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

  5. #5
    Nouveau membre du Club
    Inscrit en
    Janvier 2008
    Messages
    94
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 94
    Points : 34
    Points
    34
    Par défaut
    Re ,

    Résultat : après test ( 15:20 GMT)avec Delphi XE.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TextToSearch := ReadLn(F);
    *1 : Créer une erreur à la compile ,incompatible type un String et une procédure.

    [DCC Erreur] Unit3.pas(362): E2010 Types incompatibles : 'string' et 'procedure, untyped pointer or untyped parameter'

    *2: les résultats affichées dans la listBox ne sont pas ceux qu'on recherchais.



    Fonction de ShaiLeTroll:

    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
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
     
    function SearchBinaryInFile(const FileName:string; const SearchBinary: TByteDynArray; out OffSets: TInt64DynArray; KeepOffSet: Boolean = False): Integer;
     
     
     
    const
       BUF_SIZE: Integer = 1024;
       ZERO: Int64 = 0;
     
    var
       FileToSearch: Integer;
       FileLength, iReaded: Int64;
       SearchBuf: array of Byte;
       iSearchBufPos, iSearch, iMark, iCountFound, iRememberFound, iRememberOverlap: Integer;
       SearchLen: Integer;
       AmtTransferred: Integer;
       LastFound: Boolean;
       UpSearchString: string;
    begin
       SearchLen := Length(SearchBinary);
     
       Result := 0;
       if SearchLen <= 0 then
         Exit;
     
       SetLength(SearchBuf, BUF_SIZE);
       iReaded := 0;
     
       FileToSearch := FileOpen(FileName, fmOpenRead);
       if FileToSearch < 0 then
         Exit;
       try
          FileLength := FileSeek(FileToSearch, ZERO, FILE_END);
          FileSeek(FileToSearch, ZERO, FILE_BEGIN);
     
          iCountFound := 0;
     
          while iReaded < FileLength do
          begin
             AmtTransferred := FileRead(FileToSearch, SearchBuf[0], BUF_SIZE); // [0] parce que c'est un tableau dynamique
             iRememberFound := iCountFound;
             iRememberOverlap := iRememberFound;
             iSearchBufPos := 0;
             iSearch := 0;
             LastFound := False;
     
             while iSearchBufPos < AmtTransferred do
             begin
                // Comparaison Octet par Octet du Tableau d'Octet recherché
                for iMark := iCountFound to SearchLen - 1 do // -1 car type Dyn Array
                begin
                   iSearch := iSearchBufPos + iMark - iRememberFound;
                   if iSearch >= AmtTransferred then
                      Break;
     
                   if SearchBuf[iSearch] = SearchBinary[iMark] then
                   begin
                      Inc(iCountFound);
     
                      LastFound := iCountFound >= SearchLen;
                      if LastFound then
                      begin
                         Inc(Result);
     
                         if KeepOffSet then
                         begin
                            SetLength(OffSets, Length(OffSets) + 1);
                         //   if AcceptOverlap then
                         //     OffSets[High(OffSets)] := iReaded + iSearchBufPos - iRememberOverlap
                          //  else
                              OffSets[High(OffSets)] := iReaded + iSearchBufPos - iRememberFound;
                         end;
     
     
     
     
     
                           Inc(iSearchBufPos, SearchLen - iRememberFound);
     
                         iCountFound := 0;
                         iRememberFound := 0;
                         Break;
                      end;
                   end else begin
                      iCountFound := 0;
                      iRememberFound := 0;
                      Break;
                   end;
                end;
     
                if iSearch >= AmtTransferred then
                  Break;
     
                if LastFound then
                  LastFound := False
                else
                  Inc(iSearchBufPos, 1);
             end;
             Inc(iReaded, AmtTransferred);
          end;
       finally
          FileClose(FileToSearch);
       end;
    end;




    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
    procedure TForm3.BtnClick(Sender: TObject);
    var F: TextFile;
     
      SearchBinary, Buffer: TByteDynArray;
      BufferListBox: string[32];
      TextToSearch: String;
      OffSets: TInt64DynArray;
      FileName : string;
      I: integer;
     
     
        TSL     : TStringList;
        TFS     : TFileStream;
     
      begin
    if OpenDialog1.Execute then
     
     
         ReadFile(OpenDialog1.FileName, ListBox1.Items);
     
     
    begin
      AssignFile(F, 'Data.txt');
      Reset(F);
      while not Eof(F) do
      begin
        //TextToSearch := { créer une erreur lorsque on compile ShaiLeTroll }
         ReadLn(F);
     
        SetLength(Buffer, 16);
        SetLength(SearchBinary, 16);
        HexToBin(PAnsiChar(Text), PAnsiChar(@SearchBinary[0]), 16);
        SearchBinaryInFile('BinaryFile.bin', SearchBinary, OffSets, true);
     
        TFS := TFileStream.Create('BinaryFile.bin',fmOpenRead);
     
        try
        for I := Low(OffSets) to High(OffSets) do
     
           ListBox3.Items.Add(Format('%.8x :%s  ', [I,TextToSearch]));
     
        finally
         TFS.Free();
     
        end;
     
     
    end;
    end;
     
     
    end;
    Comme on voit sur l'image attachée , les valeurs attendues ne sont pas ceux affichées.Merci pour vos suggestions.
    Images attachées Images attachées  

  6. #6
    Expert éminent sénior
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Points : 10 008
    Points
    10 008
    Par défaut
    Salut

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TextToSearch := ReadLn(F);
    , parce que ReadLn est une procédure.

    donc:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ReadLn(F, TextToSearch);
    devrait aller mieux.

    @+ Claudius

  7. #7
    Nouveau membre du Club
    Inscrit en
    Janvier 2008
    Messages
    94
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 94
    Points : 34
    Points
    34
    Par défaut
    Citation Envoyé par Cl@udius Voir le message
    Salut

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TextToSearch := ReadLn(F);
    , parce que ReadLn est une procédure.

    donc:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ReadLn(F, TextToSearch);
    devrait aller mieux.

    @+ Claudius

    Salut Claude ;


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     for I := Low(OffSets) to High(OffSets) do
     
        ListBox3.Items.Add(Format('%.8x :%s  ', [I,TextToSearch]));

    Merci , oui en effet , là y'a aucune erreur et le code s'améliore , mais les 02 lignes qu'on voulait afficher sont répétées X fois dans la listBox au lieu d'afficher uniquement 02 lignes de 16 bytes chacune.

    Je joins l'image qui illustre ça.

  8. #8
    Nouveau membre du Club
    Inscrit en
    Janvier 2008
    Messages
    94
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 94
    Points : 34
    Points
    34
    Par défaut
    Bonjour à tous,

    Aprés une longue nuit à essayé d'avoir le résultat souhaité , j'obtiens toujours les 02 lignes X fois affichées dans la ListBox.
    Je joins l'image qui illustre ça.
    Images attachées Images attachées  

  9. #9
    Expert éminent sénior
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Points : 10 008
    Points
    10 008
    Par défaut
    Salut

    Tu dois obtenir plusieurs occurrences lors de la recherche.

    Puisque la fonction de ShaiLeTroll renvoie ce nombre autant pour l'instant l'afficher.

    A des fins de test:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
          NbOccur := SearchBinaryInFile(BinaryFile, SearchBinary, Offsets, True);
          for I := Low(Offsets) to High(Offsets) do
            ListBox3.Items.Add(Format('%d/%d %.8x: %s',
              [I + 1, NbOccur, Offsets[I], TextToSearch]));
    Mais là, of course, la synchronisation des ListBox n'est plus adaptée.

    @+

  10. #10
    Nouveau membre du Club
    Inscrit en
    Janvier 2008
    Messages
    94
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 94
    Points : 34
    Points
    34
    Par défaut
    Citation Envoyé par Cl@udius Voir le message
    Salut

    Tu dois obtenir plusieurs occurrences lors de la recherche.

    Puisque la fonction de ShaiLeTroll renvoie ce nombre autant pour l'instant l'afficher.

    A des fins de test:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
          NbOccur := SearchBinaryInFile(BinaryFile, SearchBinary, Offsets, True);
          for I := Low(Offsets) to High(Offsets) do
            ListBox3.Items.Add(Format('%d/%d %.8x: %s',
              [I + 1, NbOccur, Offsets[I], TextToSearch]));
    Mais là, of course, la synchronisation des ListBox n'est plus adaptée.

    @+

    Bonjour Claude et ShaiLeTroll ,

    Merci pour ta suggestion et le code proposer Claude.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Tu dois obtenir plusieurs occurrences lors de la recherche.
    Juste les valeurs qu'on veut afficher Claude , qui sont dans le fichier BinaryFile.le fichier Data.txt sert de guide pour nous dire ce qu'on doit chercher dans le fichier BinaryFile.

    J'ai simplifier le code , mais le résultat affiche toujours X fois les lignes recherchés dans la ListBox.Ce que l'ont cherche à faire simplement :

    Etape 1 :
    * 1 : Charger un fichier binaire en cherchant des valeurs indiquées dans le fichier Data.txt.

    Etape 2 :

    On commence la recherche et LA les valeurs sont trouvées dans le BinaryFile , if OK (trouvées) alors on les lis et on les affiche .
    92 27 41 D0 7A 78 77 21 2F 99 27 40 D0 7B 78 77
    23 F3 72 23 F3 DB 70 21 3A 7B 29 F9 D1 70 21 3B

    Etape 3:
    On affiche les valeurs LUES et trouvées qui sont DANS le fichier BinaryFile.

    Ensuite , tout simplement on affichera QUE les valeurs recherchées dans le fichier binaire .


    Merci pour vos suggestions.

  11. #11
    Expert éminent sénior
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Points : 10 008
    Points
    10 008
    Par défaut
    Citation Envoyé par Marley_T Voir le message
    J'ai simplifier le code , mais le résultat affiche toujours X fois les lignes recherchés dans la ListBox.
    C'est normal puisque on boucle sur les bornes de Offsets.
    Si 3 occurrences, alors 3 lignes insérées dans la ListBox.

    Citation Envoyé par Marley_T Voir le message
    Ensuite , tout simplement on affichera QUE les valeurs recherchées dans le fichier binaire.
    Alors c'est tout simple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
          NbOccur := SearchBinaryInFile(BinaryFile, SearchBinary, Offsets, False);
          if NbOccur > 0 then
            ListBox3.Items.Add(TextToSearch);
    @+

  12. #12
    Nouveau membre du Club
    Inscrit en
    Janvier 2008
    Messages
    94
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 94
    Points : 34
    Points
    34
    Par défaut
    Citation Envoyé par Cl@udius Voir le message
    C'est normal puisque on boucle sur les bornes de Offsets.
    Si 3 occurrences, alors 3 lignes insérées dans la ListBox.


    Alors c'est tout simple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
          NbOccur := SearchBinaryInFile(BinaryFile, SearchBinary, Offsets, False);
          if NbOccur > 0 then
            ListBox3.Items.Add(TextToSearch);
    @+


    Salut Claude ,
    Merci à toi .

    je voulais te demandais , est ce qu'on pourrait lire et afficher QUE les lignes souhaitées à l’ouverture du fichier BinaryFile ?

    ( le fichier Data.txt) nous sert juste de guide pour nous montrer quelles valeurs chercher .

    Merci pour tes suggestions.
    Images attachées Images attachées  

  13. #13
    Expert éminent sénior
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Points : 10 008
    Points
    10 008
    Par défaut
    Je comprends pas ta question.

    Le code que j'ai proposé renvoie dans ListBox3 uniquement les valeurs de Data.txt trouvées dans BinaryFile.bin.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if NbObccur > 0 then //...
    Cette condition répond à ta demande. Ou alors je n'ai compris ce que tu voulais.

    @+

  14. #14
    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
    Citation Envoyé par Marley_T Voir le message
    je voulais te demandais , est ce qu'on pourrait lire et afficher QUE les lignes souhaitées à l’ouverture du fichier BinaryFile ?
    Ce n'est pas déjà ce que fais le code de Cl@udius ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        NbOccur := SearchBinaryInFile(BinaryFile, SearchBinary, Offsets, False, 1);
        if NbOccur > 0 then
          ListBox3.Items.Add(TextToSearch);
    Noté le 1 supplémentaire, si on veut juste savoir si il existe ou pas, sans avoir besoin de sa position ni du nombre d'occurence, autant arrêter la recherche le plus tôt possible surtout si il y a bcp de valeur a chercher !


    Citation Envoyé par Marley_T
    On commence la recherche et LA les valeurs sont trouvées dans le BinaryFile , if OK (trouvées) alors on les lis et on les affiche .
    Tient, cette phrase n'a pas de sens, la recherche à trouver la valeur, pas besoin de la lire puisque c'est une valeur connue !

    Tu n'es vraiment pas clair !
    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

  15. #15
    Nouveau membre du Club
    Inscrit en
    Janvier 2008
    Messages
    94
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 94
    Points : 34
    Points
    34
    Par défaut
    Citation Envoyé par Cl@udius Voir le message
    Je comprends pas ta question.

    Le code que j'ai proposé renvoie dans ListBox3 uniquement les valeurs de Data.txt trouvées dans BinaryFile.bin.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if NbObccur > 0 then //...
    Cette condition répond à ta demande. Ou alors je n'ai compris ce que tu voulais.

    @+

    Oui , Claude , on souhaite juste afficher les valeurs demandées lorsque le fichier binaire sera charger .


    * 1 : on cherche valeurs Hexa dans le binaire.
    * 2 : si valeurs Hexa trouvées OK , les lire DU fichier binaire et les afficher.

    C'est tout , Claude.

  16. #16
    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
    Citation Envoyé par Marley_T Voir le message
    * 2 : si valeurs Hexa trouvées OK , les lire DU fichier binaire et les afficher
    Si Trouvé pourquoi la lire ??? suffit d'afficher la valeur cherchée !
    Ou alors tu t'expliques très mal !

    Donne le code qui tu utilises actuellement avec les modifications indiqués par Cl@udius !
    çà doit donner exactement ce que tu décris !
    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

  17. #17
    Nouveau membre du Club
    Inscrit en
    Janvier 2008
    Messages
    94
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 94
    Points : 34
    Points
    34
    Par défaut

    On commence la recherche et LA les valeurs sont trouvées dans le BinaryFile , if OK (trouvées) alors on les lis et on les affiche .


    Citation Envoyé par ShaiLeTroll Voir le message

    Tient, cette phrase n'a pas de sens, la recherche à trouver la valeur, pas besoin de la lire puisque c'est une valeur connue !

    Tu n'es vraiment pas clair !


    Salut ShaiLeTroll ,

    On souhaite afficher cette valeur connue que l'ont recherche .
    * On cherche cette valeur dans le fichier Binaire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    92 27 41 D0 7A 78 77 21 2F 99 27 40 D0 7B 78 77



    Citation Envoyé par ShaiLeTroll Voir le message

    Donne le code qui tu utilises actuellement avec les modifications indiqués par Cl@udius !çà doit donner exactement ce que tu décris !
    Oui voici le code utilisé :

    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
     
     
    procedure TForm3.Button1Click(Sender: TObject);
    var F: TextFile;
     
      SearchBinary, Buffer: TByteDynArray;
      BufferListBox: string[32];
      TextToSearch: String;
      OffSets: TInt64DynArray;
      FileName : string;
      I: integer;
      j:integer;
       NbOccur:Integer;
     
     
        TSL     : TStringList;
        TFS     : TFileStream;
     
      begin
    if OpenDialog1.Execute then
     
     
         ReadFile(OpenDialog1.FileName, ListBox1.Items);
     
     
    begin
      AssignFile(F, 'Data.txt');
      Reset(F);
      while not Eof(F) do
      begin
     
         ReadLn(F,TextToSearch);
     
        SetLength(Buffer, 16);
        SetLength(SearchBinary, 16);
        HexToBin(PAnsiChar(Text), PAnsiChar(@SearchBinary[0]), 16);
       SearchBinaryInFile('BinaryFile.bin', SearchBinary, OffSets, false);
      // NbOccur :=SearchBinaryInFile('BinaryFile', SearchBinary, Offsets, True);
        TFS := TFileStream.Create('BinaryFile.bin',fmOpenRead);
     
        try
     
      // for I := 0  to Length(Buffer)  do
     
     
      ListBox3.Items.Add(TextToSearch);
     
        finally
         TFS.Free();
     
        end;
     
     
     
     
     
    end;
    end;

    * On la trouve dans le fichier BinaryFile , on l'affiche dans la ListBox, tout simplement.

  18. #18
    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
    Essaye une peu de comprendre la proposition de Cl@udius !
    Puis la mienne gérant le Threshold !

    Le code que tu fournis est effectivement faux car tu n'as pas cherché à le comprendre !
    Faut que tu le trouves par toi même car le bon code est plusieurs fois présent dans le sujet ! Certe il n'est pas entier, il faut savoir l'intégrer, si tu n'arrives pas c'est inquiétant !

    Pourquoi créer ce TFS, c'est inutile, arrête de bricoler ! soit un peu plus sérieux ou abandonne ! Je ne suis pas Poissonnier !
    Pourquoi ne pas récupérer et utiliser NbOccur, c'était pourtant l'astuce du code de Cl@udius !
    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

  19. #19
    Nouveau membre du Club
    Inscrit en
    Janvier 2008
    Messages
    94
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 94
    Points : 34
    Points
    34
    Par défaut
    Citation Envoyé par Cl@udius Voir le message
    C'est normal puisque on boucle sur les bornes de Offsets.
    Si 3 occurrences, alors 3 lignes insérées dans la ListBox.


    Alors c'est tout simple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
          NbOccur := SearchBinaryInFile(BinaryFile, SearchBinary, Offsets, False);
          if NbOccur > 0 then
            ListBox3.Items.Add(TextToSearch);
    @+


    Bonjour Claude ,

    Je vais essayer ta méthode aujourd'hui et poster le résultat final en fin de journée.Merci pour ta disponibilité .Bonne journée et bon week end aussi.

Discussions similaires

  1. [Méthodes]UML vs MERISE Lequel pour quoi ?
    Par Daniel258 dans le forum Méthodes
    Réponses: 5
    Dernier message: 31/03/2003, 11h49
  2. Gros Problème avec DirectShow et la méthode RELEASE
    Par Olivier Delmotte dans le forum DirectX
    Réponses: 3
    Dernier message: 10/03/2003, 18h10
  3. [Singleton] Différences avec méthodes statiques
    Par Franche dans le forum Design Patterns
    Réponses: 1
    Dernier message: 26/02/2003, 17h10
  4. Probleme d'impression avec la méthode TForm->Print()
    Par Kid Icarus dans le forum C++Builder
    Réponses: 13
    Dernier message: 31/07/2002, 14h26
  5. Cryptage en C selon la méthode de césat
    Par shenron dans le forum C
    Réponses: 2
    Dernier message: 31/05/2002, 08h22

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