Einzelnen Beitrag anzeigen

marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#2

Re: hex wert in datei suchen

  Alt 25. Mai 2006, 11:14
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
  Mit Zitat antworten Zitat