Rechercher un mot dans une source binaire [Résolu]

Signaler
Messages postés
218
Date d'inscription
dimanche 1 mai 2005
Statut
Membre
Dernière intervention
15 novembre 2009
-
Messages postés
218
Date d'inscription
dimanche 1 mai 2005
Statut
Membre
Dernière intervention
15 novembre 2009
-
Bonjour, voilà j'ai fait une petite fonction booléenne pour savoir si oui ou non un mot a été trouvé dans la source d'un fichier, je voulais savoir si il existe ou si vous connaissez une méthode plus rapide que celle que j'ai faite qui suit :

Peut être mon idée de tableau est pas bonne...

---
SearchStr = "Le mot"
---
Dim bContents() As Byte
ReDim bContents(LOF(oFile))
Get #oFile, , bContents
---

La partie de recherche que j'aimerai amélioré :

        For i = 0 To UBound(bContents)
            If bContents(i) = Asc(Left$(SearchStr, 1)) Then
                Found = 0
                For j = Len(SearchStr) - 1 To 1 Step -1
                    If bContents(i + j) <> Asc(Mid$(SearchStr, 1 + j, 1)) Then
                        Found = -1
                        Exit For
                    End If
                Next
                If Found = 0 Then
                    MSGBOX " TROUVER !"
                End If
            End If
        Next

Ps: Si vous ne comprenez rien dite le moi j'essayerai de mieux m'expliquer lol.

kakenette

13 réponses

Messages postés
13280
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
46
comme quoi le fichier est important !!

j'ai dit "pas loin", le STRCONV était juste à appliquer au dessus



Private Sub 
Command1_Click()



     Dim bContents() As Byte
     Dim SearchStr As String
     Dim oFile As Long
    
     oFile = FreeFile
    
     Open "C:\Projet1.exe" For Binary Access Read As #oFile
         ReDim bContents(LOF(oFile))
         Get #oFile, , bContents
     Close #oFile

     SearchStr = "This program cannot be run
in DOS mode" '"Projet1.exe" '"MSVBVM60.DLL" '"Le
mot"

     Dim s$
     s = bContents
     s = StrConv(s, vbUnicode)
     If InStrB(1, s, SearchStr) > 0 Then MsgBox "TROUVé !"
End Sub





plus rapide non?
et là tu peux jouer autant que tu veux, boucler avec un tableau de mots à trouver


<hr size="2" width="100%" />
Prenez un instant pour répondre à [sujet-SONDAGE-POP3-POUR-CS_769706.aspx ce sondage] svp <
Messages postés
13280
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
46
salut,

à vérifier avec le fichier en question mais logiquement, "le mot" est alors entrecoupé de vbnullchar

dans quel cas on doit pouvoir accélérer la recherche avec (après la lecture vers le tableau de byte) :

dim s$
s=bContents
found = iif(instrb(1,s,strconv(SearchStr,vbunicode))=0,-1,0)

pas testé et juste tapé dans cette fenêtre, çà doit pas être bien loin de çà....
++
<hr size="2" width="100%" />Prenez un instant pour répondre à [sujet-SONDAGE-POP3-POUR-CS_769706.aspx ce sondage] svp <
Messages postés
218
Date d'inscription
dimanche 1 mai 2005
Statut
Membre
Dernière intervention
15 novembre 2009
1
Hello, je comprend pas comment modifier avec se que tu ma donner...

kakenette
Messages postés
13280
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
46
j'ai pourtant repris tes "-1" et "0" du la même manière que toi, justement....



SearchStr = "Le mot"
Dim bContents() As Byte
ReDim bContents(LOF(oFile))
Get #oFile, , bContents





dim s$
s=
bContents


if instrb(1,s,
strconv(
SearchStr
,vbunicode)
)>0 then
MSGBOX "TROUVé !"

<hr size="2" width="100%" />
Prenez un instant pour répondre à [sujet-SONDAGE-POP3-POUR-CS_769706.aspx ce sondage] svp 
Messages postés
218
Date d'inscription
dimanche 1 mai 2005
Statut
Membre
Dernière intervention
15 novembre 2009
1
Et bien hélasse ça marche pas. ça ne me trouve pas le mot. :(

kakenette
Messages postés
218
Date d'inscription
dimanche 1 mai 2005
Statut
Membre
Dernière intervention
15 novembre 2009
1
j'ai remplacer toute ma boucle de recherche par se que tu ma mis mais ça fonctionne pas, ça me renvoie toujours -1
Messages postés
13280
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
46
j'ai pas testé et c'est saisi ici.....
tu peux héberger un fichier?
Messages postés
218
Date d'inscription
dimanche 1 mai 2005
Statut
Membre
Dernière intervention
15 novembre 2009
1
hein ? j'ai pas compris se que tu veux me dire, tu veux que j'héberge quoi?

En réalité la fonction est asser simple, J'ouvre un fichier, je récupère la source binaire et je regarde si oui ou non un mot s'y trouve. Pour le moment j'ai pas trouver plus vite que ma boucle...

kakenette
Messages postés
13280
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
46
si c'est un fichier "normal" (ascii ou ansi), pourquoi tu l'ouvres en binaire?
c'est pourquoi je demandais un exemple de fichier

et dans ce cas :



Private Sub 
Form_Load()

    Dim FF As Integer, sBuffer As String
    Const SearchStr As String = "Le mot"
    FF = FreeFile
    Open "C:\fichier.txt" For Input As #FF
        sBuffer = Input(LOF(FF), 1)
    Close #FF
    
    If InStrB(1, sBuffer, SearchStr) > 0
Then MsgBox "TROUVé !"
End Sub



possible également de lire ligne par ligne pour ne pas avoir à récupérer la totalité d'un bloc, la différence d'exécution ne s'en fera ressentir que sur de gros fichiers, à tester...


<hr size="2" width="100%" />
Prenez un instant pour répondre à [sujet-SONDAGE-POP3-POUR-CS_769706.aspx ce sondage] svp 
Messages postés
218
Date d'inscription
dimanche 1 mai 2005
Statut
Membre
Dernière intervention
15 novembre 2009
1
C'est comme ca que tu voulais dire ?

Private Sub Command1_Click()

        Dim bContents() As Byte
        Dim SearchStr As String
        Dim oFile As Long
       
        oFile = FreeFile
       
        Open "Chemin du fichier" For Binary Access Read As #oFile
            ReDim bContents(LOF(oFile))
            Get #oFile, , bContents
        Close #oFile

        SearchStr = "Le mot"

        Dim s$
        s = bContents
        If InStrB(1, s, StrConv(SearchStr, vbUnicode)) > 0 Then MsgBox "TROUVé !"

End Sub

Ca trouve pas :(

kakenette
Messages postés
218
Date d'inscription
dimanche 1 mai 2005
Statut
Membre
Dernière intervention
15 novembre 2009
1
un exécutable ( dsl j'ai poster entre, on c'est croisé )

kakenette
Messages postés
218
Date d'inscription
dimanche 1 mai 2005
Statut
Membre
Dernière intervention
15 novembre 2009
1
En faite je scan la ressource d'une application. donc la source hexadécimal, et je regarde des mots clé dedans. ma solution fonctionne mais si le fichier fait + de 2Mo ça prend trop de temps. surtout que par ".exe" je regarde plusieurs mot donc je fait plusieurs fois la boucle.

kakenette
Messages postés
218
Date d'inscription
dimanche 1 mai 2005
Statut
Membre
Dernière intervention
15 novembre 2009
1
Oh super! Merci ça va super vite :p Ah je te remercie finalement on est arriver et grâce a toi! La prochaine fois j'essayerai de te rendre la part même si sa serra a mon avis très dure :D A oui ça marche un peut comme un Instr() mais c un Instr Binaire :p Cool merci.

kakenette