Einzelnen Beitrag anzeigen

Delphi.Narium

Registriert seit: 27. Nov 2017
2.508 Beiträge
 
Delphi 7 Professional
 
#18

AW: Hexwert in Binärdatei suchen und Position ermitteln

  Alt 5. Mär 2018, 19:57
Zwischen Deinem Wunsch und HolgerX Implementierung gibt es eine "Missverständnis":

Wenn ich die Implementierung recht verstehe, müsste der zu übergebende Suchbegriff 'XPR0' + Chr(0)+ '(' sein.

Sei bitte so gut und versuche es mal in der Form:
Delphi-Quellcode:

var
  S : TStringStream;
  i : integer;
  A : array of Byte;
  Data : AnsiString;
begin
  SetLength(A,6);
  A[0] := 58;
  A[1] := 50;
  A[2] := 52;
  A[3] := 30;
  A[4] := 00;
  A[5] := 28;

  S := TStringStream.Create(Memo1.Lines.Text);
  try
    S.Position := 0;
    EditPos.Text := IntToStr( FindPosInStream(S,A));
  finally
    S.Free;
  end;
end;
Das Verständnisproblem ist bisher: HolgerXs Routine erwartet einen String. Dieser wird dann byteweise in ein Array geschrieben und dann wird der Inhalt dieses Arrays im Stream gesucht.

Du hast jedoch bereits eine Zeichenfolge in Hex-Werte umgewandelt und dann diese übergeben. Das passt nicht zusammen.

Andererseits enthält die zu suchende Sequenz eine hexadezimale 0. Diese könnte man aber per Eingabefeld, wie von HolgerX im Beispiel vorgeschlagen, nicht übergeben.

Wenn Du also zwingend die Hexwerte eingeben musst, was hier durchaus sinnvoll erscheint, muss der Aufruf von HolgerXs Routine angepasst werden.

Ungetesteter Vorschlag:
Delphi-Quellcode:
procedure TForm1.ButtonSearchClick(Sender: TObject);
var
  S : TStringStream;
  i : integer;
  k : Integer;
  x : String;
  A : array of Byte;
  Data : AnsiString;
begin
  // Eingabe übernehmen und diese von führenden und folgenden Leerzeichen befreien.
  // Da die Leerzeichen als Trenner für die Einzelwerte dienen, benötigen wir am Ende
  // für den letzten Einzelwert noch ein Leerzeichen.
  Data := Trim(EditSearch.Text) + ' '; // hier: 58 50 52 30 00 28
  // Zuerst zählen wir nun, wieviele Leerzeichen es in der Eingabe gibt.
  k := 0;
  for i := 1 to Length(Data) do begin
    case Data[i] of
      #32 : Inc(k);
    end;
  end;
  // Das Array für den Suchbegriff wird entsprechend dimensioniert.
  SetLength(A,k);
  x := '';
  k := 0;
  // Nun suchen wir wieder unsere oben gezählzen Leerzeichen.
  For i := 1 to Length(Data) do begin
    case Data[i] of
      #32 : begin
              // Wird eins gefunden, so machen wir aus dem bisher
              // gefundenen eine Zahl und übergeben diese ans Array.
              A[k] := StrToInt(x);
              // Den Zähler für die Position im Array erhöhen.
              Inc(k);
              // Leermachen für den nächsten Hexwert.
              x := '';
            end;
    else
      // Zeichen aus der Eingabe "sammeln", bis ein Leerzeichen kommt.
      x := x + Data[i];
    end;
  end;

  S := TStringStream.Create(Memo1.Lines.Text);
  try
    S.Position := 0;
    EditPos.Text := IntToStr(FindPosInStream(S,A));
  finally
    S.Free;
  end;
end;
(Ist jetzt nur als Idee gedacht und etwas aufwändig, aber dadurch (hoffentlich) etwas verständlicher.)
  Mit Zitat antworten Zitat