AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi Hexwert in Binärdatei suchen und Position ermitteln
Thema durchsuchen
Ansicht
Themen-Optionen

Hexwert in Binärdatei suchen und Position ermitteln

Ein Thema von fringer · begonnen am 2. Mär 2018 · letzter Beitrag vom 7. Mär 2018
Antwort Antwort
fringer

Registriert seit: 25. Feb 2018
15 Beiträge
 
#1

AW: Hexwert in Binärdatei suchen und Position ermitteln

  Alt 4. Mär 2018, 10:30
@brechi

vielen Dank für deine Funktion. Ich habe diese mal in mein Programm
eingearbeitet. Beim ausführen bekomme ich jedoch einen FOR-Schleifen
Fehler "FOR Schleifenvariable muss vom ordinalen Typ sein), daher
habe ich aus den Variablen "i" und "j" den Datentyp "integer" anstelle
von "int64" gemacht. Damit läuft die For-Schleife zwar aber die
Funktion gibt nicht mehr das gewünschte Ergebnis aus.

Und ich muss gestehen das ich die Funktion noch nicht komplett verstanden habe. Wäre eine Erläuterung möglich?

Herzlichen Dank und noch einen schönen Sonntag.
fringer
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.235 Beiträge
 
Delphi 12 Athens
 
#2

AW: Hexwert in Binärdatei suchen und Position ermitteln

  Alt 4. Mär 2018, 11:46
Im Prinzip läuft alles auf einen Byte-Vergleich hinaus.
Delphi-Quellcode:
var
  Daten, Suche: TBytes;
  i, i2: Integer;
  B: Boolean;

for i := 0 to Hight(Daten) - High(Suche) do // for i := 0 to Hight(Daten) - (Length(Suche) - 1) do
  for i2 := 0 to High(Suche) do
    if Daten[i] <> Suche[i2] then
      Break
    else if i2 = High(Suche) then
      Gefunden(i);
Die innere Schleife kann man z.B. durch CompareMemory ersetzen
und noch an anderen Stellen bissl optimieren, aber im Prinzip macht so ein Such-Code immer das Gleiche.

Delphi-Quellcode:
for i := 0 to Hight(Daten) - High(Suche) do begin
  {$REGION 'umgedrehte Suchlogik sie Antwort #6'}
  B := False;
  for i2 := 0 to High(Suche) do
    if Daten[i] <> Suche[i2] then
      Break
    else if i2 = High(Suche) then
      B := True;
  {$ENDREGION}
  if B then
    Gefunden(i);
end;
Delphi-Quellcode:
for i := 0 to Hight(Daten) - High(Suche) do
  if CompareMemory(@Daten[i], @Suche[0], Length(Suche)) then
    Gefunden(i);
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu ( 4. Mär 2018 um 11:54 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.235 Beiträge
 
Delphi 12 Athens
 
#3

AW: Hexwert in Binärdatei suchen und Position ermitteln

  Alt 4. Mär 2018, 11:51
Delphi-Quellcode:
if _Stream.read(data[0], _Stream.Size) <> _Stream.size then
    raise Exception.Create('Fehler beim Lesen der Daten');
Was für ein Fehler?
_Stream.ReadBuffer(data[0], _Stream.Size); > Delphi-Referenz durchsuchenTStream.ReadBuffer entsprechend dem alte Delphi-Referenz durchsuchenBlockRead
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
HolgerX

Registriert seit: 10. Apr 2006
Ort: Leverkusen
961 Beiträge
 
Delphi 6 Professional
 
#4

AW: Hexwert in Binärdatei suchen und Position ermitteln

  Alt 4. Mär 2018, 12:03
Hmm..

Hab das mal etwas zusammengefast und für Streams verallgemeinert:

Delphi-Quellcode:
function FindPosInStream(AStream : TStream; AData : Array of Byte):int64;
var
  P : int64;
  B : Array of Byte;
  L : integer;
begin
  Result := -1; // Rückgabe -1, wenn nicht vorhanden!!
  L := length(AData);

  SetLength(B,L);
  while (Result = -1) do begin
    // Suche beginnt an aktueller Streamposition!
    P := AStream.Position;
    // Gleiche Anzahl Bytes einlesen, wie gesucht wird
    // Wenn keine/ungenügende Bytes verfügbar, dann ist der Suchstring nicht mehr möglich
    if AStream.Read(B[0],L) = L then begin
      // Absolute Vergleich
      if CompareMem(@B[0], @AData[0],L) then begin
        // Gefunden
        Result := P;
        Break;
      end;
      // zurück zur nächsten Startposition im Stream
      AStream.Position := P+1;
    end else
      Break;
  end;
end;

procedure TForm1.ButtonSearchClick(Sender: TObject);
var
  S : TStringStream;
  i : integer;
  A : array of Byte;
  Data : AnsiString;
begin
  Data := EditSearch.Text;
  SetLength(A,Length(Data));
  For i := 0 to Length(Data)-1 do
    A[i] := Ord(Data[i+1]);

  S := TStringStream.Create(Memo1.Lines.Text);
  try
    S.Position := 0;
    EditPos.Text := IntToStr( FindPosInStream(S,A));
  finally
    S.Free;
  end;
end;
Als Beispiel einfach eine Verwendung mit einem StringStream, kann aber auch ein FileStream sein, so dass nicht die ganze Datei in den Speicher geladen werden muss..
Es ist nicht auf Speed optimiert, da dann immer die Daten in größeren Blöcken gelesen würden und Teile davon mit den Suchdaten verglichen werden würden.
(Erstellt mit D6, somit Memo mit AnsiStrings)

Geändert von HolgerX ( 4. Mär 2018 um 12:07 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.235 Beiträge
 
Delphi 12 Athens
 
#5

AW: Hexwert in Binärdatei suchen und Position ermitteln

  Alt 4. Mär 2018, 12:10
Bei TMemoryStream kann man auch direkt auf die Daten zugreifen.
Delphi-Referenz durchsuchenTMemoryStream.Memory
Und in diesem Fall hilft auch noch ein kleiner Cast:
Delphi-Quellcode:
PByte(MemoryStream.Memory)
PByte(MemoryStream.Memory)[i] // die Dereferenzierung ist implizit, aber man kann auch PByte(MemoryStream.Memory)^[i]
(PByte(MemoryStream.Memory) + i)^ // oder mit Pointer-Arithmetic
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:05 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz