cs_jacques13
Messages postés252Date d'inscriptionmardi 3 juin 2003StatutMembreDernière intervention29 juin 2013
-
12 sept. 2006 à 21:20
cs_jacques13
Messages postés252Date d'inscriptionmardi 3 juin 2003StatutMembreDernière intervention29 juin 2013
-
16 sept. 2006 à 11:59
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
cs_MPi
Messages postés3877Date d'inscriptionmardi 19 mars 2002StatutMembreDernière intervention17 août 201822 12 sept. 2006 à 23:17
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 ???
cs_jacques13
Messages postés252Date d'inscriptionmardi 3 juin 2003StatutMembreDernière intervention29 juin 2013 13 sept. 2006 à 19:21
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
cs_MPi
Messages postés3877Date d'inscriptionmardi 19 mars 2002StatutMembreDernière intervention17 août 201822 13 sept. 2006 à 23:36
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.
cs_jacques13
Messages postés252Date d'inscriptionmardi 3 juin 2003StatutMembreDernière intervention29 juin 2013 14 sept. 2006 à 20:58
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
Vous n’avez pas trouvé la réponse que vous recherchez ?
cs_MPi
Messages postés3877Date d'inscriptionmardi 19 mars 2002StatutMembreDernière intervention17 août 201822 15 sept. 2006 à 23:20
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.
cs_jacques13
Messages postés252Date d'inscriptionmardi 3 juin 2003StatutMembreDernière intervention29 juin 2013 16 sept. 2006 à 11:59
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)