Recherche dans un fichier binaire

Signaler
Messages postés
252
Date d'inscription
mardi 3 juin 2003
Statut
Membre
Dernière intervention
29 juin 2013
-
Messages postés
252
Date d'inscription
mardi 3 juin 2003
Statut
Membre
Dernière intervention
29 juin 2013
-
Bonjour,
Je suis à la recherche d'une fonction qui serait capable (un peu comme INSTR) de rechercher, de localiser et éventuellement de détruire une occurence à l'intérieur d'un fichier binaire.
Merci pour votre aide.
Jacques13

6 réponses

Messages postés
3877
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
23 août 2018
19
Qu'est-ce que tu entends par binaire ?


Si tu ouvres un fichier et place les données dans une variable String,
tu peux facilement faire un Replace (ou Instr) des occurences désirées
directement dans cette variable.  Ensuite tu récris ces données
modifiées dans le même fichier ou un autre.


Peut-être que je ne comprend pas bien le problème ???

MPi
Messages postés
252
Date d'inscription
mardi 3 juin 2003
Statut
Membre
Dernière intervention
29 juin 2013

Bien sûr, tu as raison, mais ici il s'agit d'un très gros ficher binaire (open for binary) et ta méthode nécessiterait de le tronçonner pour en examiner les différents segments. Cette méthode est réalisable mais lourde. En fait, j'avais rêvé d'une espèce de ver qui irait fouiner dans ce fichier et m'informerait des occurrences décelées.
Jacques13
Messages postés
3877
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
23 août 2018
19
Vraiment trop gros pour une String ? sachant qu'une String peut contenir ± 2 milliards de caractères ?


Si oui, tu pourrais lire le contenu du fichier section par section et
utiliser quand même Replace. Donc tu pourrais déclarer un compteur et
lire Byte par Byte jusqu'à ce que le compteur arrive à un certain
nombre, puis tu cherches le prochain saut de ligne pour éviter de
couper au milieu d'un mot que tu pourrais rechercher.


Le tout étant dans une variable String, tu utilises Replace si tu veux
vraiment remplacer une occurrence ou Instr pour trouver l'endroit de
cette occurrence si tu veux faire une autre action.


Est-ce une idée envisageable ?

MPi
Messages postés
252
Date d'inscription
mardi 3 juin 2003
Statut
Membre
Dernière intervention
29 juin 2013

Mon fameux fichier binaire est composé d'une suite architecturée de coordonnées codées en entiers longs;. sa longueur peut varier de 500 Ko à 5 Mo. Ton idée,à laquelle j'avais bien sûr déjà pensé, serait de charger la totalité de ce fichier dans une string de longueur variable qui, comme chacun sait, peut contenir 2^31 caractères, malheureusement, je n'ai jamais réussi à créer une variable string de cette taille! Il est possible qu'une finesse de VB6 m'échappe.
En tout état de cause, merci MPi de t'intéresser à mes petits problèmes, surtout à une heure aussi tardive!
Jacques13
Messages postés
3877
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
23 août 2018
19
Pour moi ce n'est pas une heure tardive... puisque je me couche tôt.

Mais il y a le décalage de 7 heures avec la France...


Bon, pour  mettre un fichier volumineux dans une String, il 
ne devrait pas y avoir de problème dans les grosseurs que tu donnes.


Par contre, le Replace peut être plus compliqué dû au fait qu'un Long
prend 4 bytes, donc "4 espaces", mais pas certain... Je te joins un
bout de code pour te faire voir. Mais peut-être le sais-tu déjà... En
fait, c'est difficile pour moi de faire les tests. Il faudrait que je
répète les mêmes valeurs plusieurs fois pour voir une différence
notable. Mais je pense que ça devrait fonctionner tout de même.


En tout cas, tu verras comment je procède pour inscrire le fichier dans
une String d'un coup. C'est assez rapide, du moins sur Celeron 1.2 GHz.


Option Explicit


Private Sub Command1_Click()  'Création d'un fichier de 19 megs

    Dim I As Long

    Dim Fichier As String

   

    Fichier = App.Path & "\Fichier.dat"

    Open Fichier For Binary As #1

   

    For I = 1 To 5000000

        Put #1, , I

    Next

    Close #1

   

    MsgBox "Terminé" & vbCrLf & _

            "Le
fichier fait " & CCur(FileLen(Fichier) / (1024 ^ 2)) & " meg"

End Sub


Private Sub Command2_Click()  'Lecture du fichier

    Dim strTemp As String

    Dim I As Long

   

    'Copier d'un coup dans une chaîne

    Open App.Path & "\Fichier.dat" For Binary As #1

    strTemp = Space$(LOF(1))

    Get #1, , strTemp

    Close #1

   

    For I = 1 To Len(strTemp) Step 4  'Step 4 pour un Long

        MsgBox Asc(Mid(strTemp, I, 1))

        Stop  'cliquer F5 pour valeur suivante

    Next

   

End Sub


Tu devrais être capable, en principe, de rouler (création/lecture) ce programme.

MPi (du Québec)
Messages postés
252
Date d'inscription
mardi 3 juin 2003
Statut
Membre
Dernière intervention
29 juin 2013

Ton bout de code est intéressant et fonctionne très bien!
Je ne sais pas pourquoi, lorsque j'essayais de confectionner des strings supérieures à 32k, j'avais une erreur de dépassement de capacité???
Je me suis permis de modifier ton code pour y introduire un test d'Instr() et de Replace(), tout marche au poil!

Private Sub Command1_Click()  'Création d'un fichier de 19 megs
    Dim I As Long
    Dim Fichier As String
    Dim opc As String * 5
    opc = "ABCDE"
    Fichier = App.Path & "\Fichier.dat"
    Open Fichier For Binary As #1
    For I = 1 To 3000000
        Put #1, , I
    Next
    Put #1, , opc
    For I = 1 To 2000000
        Put #1, , I
    Next
    Close #1
    MsgBox "Terminé" & vbCrLf & _
            "Le fichier fait " & CCur(FileLen(Fichier) / (1024 ^ 2)) & " meg"
End Sub
Private Sub Command2_Click()  'Lecture du fichier
    Dim strTemp As String
    Dim strTempBis As String
    Dim I As Long
    'Copier d'un coup dans une chaîne
    Open App.Path & "\Fichier.dat" For Binary As #1
    strTemp = Space$(LOF(1))
    Get #1, , strTemp
    Close #1
    Kill App.Path & "\Fichier.dat"
    'For I = 1 To Len(strTemp) Step 4  'Step 4 pour un Long
    '    MsgBox Asc(Mid(strTemp, I, 1))
    '    Stop  'cliquer F5 pour valeur suivante
    'Next
    I = InStr(strTemp, "ABCDE")
    MsgBox "Position de la chaîne ABCDE: " & Str$(I)
    'R = Replace(strTemp, "ABCDE", "FGHIJ")
    strTempBis = Replace(strTemp, "ABCDE", "FGHIJ")
    I = InStr(strTempBis, "ABCDE")
    MsgBox "Position de la chaîne ABCDE: " & Str$(I)
    I = InStr(strTempBis, "FGHIJ")
    MsgBox "Position de la chaîne FGHIJ: " & Str$(I)
End Sub

Je te remercie encore pour le coup de main.
J'ai été très heureux de converser avec toi.
Jacques13 (d'Aix en Provence)