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
Benutzerbild von himitsu
himitsu

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

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
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
HolgerX

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

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

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

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
Ein Therapeut entspricht 1024 Gigapeut.
  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 19:12 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz