Einzelnen Beitrag anzeigen

HolgerX

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

AW: Hexwert in Binärdatei suchen und Position ermitteln

  Alt 4. Mär 2018, 13: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 13:07 Uhr)
  Mit Zitat antworten Zitat