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.
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.
Code : Sélectionner tout - Visualiser dans une fenêtre à part SearchBinaryInFile(OpenDialog1.FileName,ListBox1.Items);
Je joins le fichier binaire et Data.txt pour ceux qui voudrait faire juste un test.
Partager