Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   hex wert in datei suchen (https://www.delphipraxis.net/70109-hex-wert-datei-suchen.html)

lbccaleb 25. Mai 2006 01:29


hex wert in datei suchen
 
hey there...

kann mir einer sagen wie ich mit delphi 7 hex (z.B.: FF2DE7) strings in dateien suchen kann???
hat jemand villeicht noch nen quellcode oder so??
soll aber auch für grosse dateien geeignet sein

danke schon mal im vorraus...

marabu 25. Mai 2006 11:14

Re: hex wert in datei suchen
 
Herzlich willkommen in der Delphi-PRAXiS.

Du kannst nach dem Prinzip des sliding window suchen. Der Beispielcode ist nicht hoch-performant, aber hat dafür didaktische Vorzüge. Es wird nach Leerzeilen gesucht.

Delphi-Quellcode:
uses
  Types,
  Math;

procedure ProcessMessages;
// hält die Nachrichtenschleife in Gang
var
  Msg: TMsg;
begin
  if PeekMessage(Msg, 0, 0, 0, PM_REMOVE) then begin
    TranslateMessage(Msg);
    DispatchMessage(Msg);
  end;
end;

function LocateHex(s: TStream; hex: TByteDynArray; out iPos: Int64): Boolean;
// gesucht wird ab der aktuellen Position
var
  buf: TByteDynArray;
  i, iBuf, iGot, iNeed: Integer;
  iHave: Int64;
begin
  iBuf := Length(hex);
  SetLength(buf, iBuf);
  iNeed := iBuf;

  repeat
    iHave := s.Size - s.Position;
    iGot := s.Read(buf[iBuf - iNeed], Min(iHave, iNeed));
    Result := CompareMem(@buf[0], @hex[0], Length(hex));
    iNeed := 1;
    Move(buf[iNeed], buf[0], iBuf - iNeed);
    ProcessMessages;
  until Result or (iGot = 0);

  if Result
    then iPos := s.Position - iBuf
    else iPos := -1;
end;

procedure TDemoForm.Button2Click(Sender: TObject);
var
  iPos: Int64;
  bda: TByteDynArray;
  fs: TFileStream;
  fn: TFileName;
  st: String;
begin
  // gesucht wird eine Leerzeile
  st := #13#10#13#10;
  SetLength(bda, Length(st));
  Move(st[1], bda[0], Length(st));
  fn := ChangeFileExt(ParamStr(0), '.dpr');
  fs := TFileStream.Create(fn, fmOpenRead or fmShareDenyNone);
  while LocateHex(fs, bda, iPos) do
  begin
    ShowMessage(IntToStr(iPos));
    fs.Position := fs.Position - 2;
  end;
  fs.Free;
end;
Freundliche Grüße vom marabu


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:20 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