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)