Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Hexwert in Binärdatei suchen und Position ermitteln (https://www.delphipraxis.net/195464-hexwert-binaerdatei-suchen-und-position-ermitteln.html)

fringer 2. Mär 2018 09:20

Hexwert in Binärdatei suchen und Position ermitteln
 
Hallo Leute,
ich würde gern in einer binär Datei einen vordefinierten Hexwert suchen (6 bytes) und mir die Position
davon anzeigen lassen.

Da mir hier letztens so gut geholfen wurde, wollte ich wieder fragen ob ich auf dem richtigen
Weg bin.

Hier mal die Theorie:

1. eine Funktion schreiben die Hexwerte in Zeichen umwandelt und in einen String übergibt
2. Binärdatei in einen Stream laden (Tmemorystream oder Tfilestream)
3. Mit pos im Stream nach dem String suchen

Wäre das die richtige Herangehensweise? Oder bin ich da auf dem Holzweg?

Meine Delphiversion ist die Version 7.

Vielen Dank im Voraus.
fringer

himitsu 2. Mär 2018 09:52

AW: Hexwert in Binärdatei suchen und Position ermitteln
 
Delphi-Referenz durchsuchenPos ist eine String-Funktion,
also das Binäre erstmal nach Text umwwandeln. (hier alles nach HEX und du kannst wirklich nach einem HexWert suchen, aber aufpassen wegen halben Werten, also nur ungerade Positionen sind gültig)

und seit Delphi 2009 auch noch aufpassen wegen Unicode (2 Byte pro Zeichen)


oder
Hex nach Binär umwandeln,
für den Vergleich Byteweise oder nach Typen wie Byte, Word, LongWord/Integer oder Int64 casten
oder Delphi-Referenz durchsuchenCompareMem
und dann mit einer Schleife in den Daten suchen (alles Stück für Stück vergleichen)



oder
Delphi-Referenz durchsuchenHxD, wenn nicht selber machen

KodeZwerg 2. Mär 2018 22:28

AW: Hexwert in Binärdatei suchen und Position ermitteln
 
Ich gehe so vor

Datei Öffnen und einen Puffer damit füllen
was auch immer ich suchen will nach hexformat umwandeln
in einer loop den puffer[X]+puffer[X]+puffer[X] usw durchforsten lassen,
falls ein teilerfolg am ende vom puffer auftritt, beim nachladen des puffers da weitermachen
puffer mit neuen daten nachladen bis dateiende und immer dateiposition merken
auf diese Weise kontrolliere ich Signaturen die dynamische Positionen haben.

Mavarik 3. Mär 2018 05:46

AW: Hexwert in Binärdatei suchen und Position ermitteln
 
Hi!

Also nach Hex-Werten kann man nicht suchen... "Hexwerte" ist kein Type...

Du kannst nach Bytes oder auch nach Zeichen suchen...

Und Du kannst sicherlich Hexwerte in Zeichen $FF -> '$'+'F'+'F' umwandeln...

Bei einem Unicode String hast Du dann im Speicher aber '$'+#0+'F'+#0+'F'+#0 stehen.

Bei 6 Hexwerten ist die Frage der Reihenfolge...

Der Wert(Word) $AABB steht im Speicher $BB,$AA.

Liegen Deine "Hexwerte" in der gleichen Reihenfolge, oder willst Du nach $1A2B3C4D5E6F als Wert suchen?

Naja und dann die Suche ist ganz einfach... Irgendwo musst Du die Werte in einen Puffer laden, falls die Datei zu groß ist um komplett in den Speicher zu passen, ansonsten einfach bei einem TMemoryStream

Mit Memory^ auf die Bytes zugreifen und vergleichen...

Wenn Du die Fragen beantwortest, können wir Dir sicherlich besser helfen!

Mavarik

fringer 3. Mär 2018 11:08

AW: Hexwert in Binärdatei suchen und Position ermitteln
 
Hallo,
vielen Dank für die bisherigen Tipps und Infos. Bisher habe ich es noch nicht geschafft zu einer Lösung zu kommen. Bin aber weiter dran ;)
Wie ich schon in diesem Thread http://www.delphipraxis.net/195394-o...ml#post1394939 schrieb, habe ich das letzte mal
vor über 10 Jahren etwas programmiert und viele Dinge die ihr Profis täglich macht fallen mir da doch schwer.

Lange rede kurzer Sinn, hier noch mal meine Problematik:

Ich habe eine xyz.dat Datei, in dieser Datei muss ich eine Zeichenfolge suchen lassen und mir davon die Anfangs-Position ausgeben lassen.

Die Zeichenkette wäre in folgenden Formaten diese:

Ascii/Ansi = XPR0�(
Decimal = 88 80 82 48 0 40
Binary = 01011000 01010000 01010010 00110000 00000000 00101000
Hex = 58 50 52 30 00 28

Meine Datei habe ich in ein TMemorystream geladen.
Dann habe ich versucht die Zeichenfolge in ein Array (Ansistring) zu laden. Aber so richtig klappt das alles noch nicht. Und wichtig ist mir
vor allem die Position in der Datei damit ich den Memorystream von dieser Stelle aus weiterverarbeiten kann.

Wenn ihr mir da wieder mit etwas Pseudocode unter die Arme greifen könntet wäre das klasse.

Vielen Dank schon mal.
fringer

brechi 3. Mär 2018 13:52

AW: Hexwert in Binärdatei suchen und Position ermitteln
 
Wenn du die Datei komplett in den Speicher laden kannst (ungetestet):

Delphi-Quellcode:

function Search(_Stream: TStream): Boolean;
var
  data: array of Byte;
  search: array of Byte;
  i: int64;
  j: int64;
  fnd: Boolean;
begin
  // daten sind im stream
  _Stream.Position := 0;
  Result := False;
  if _Stream.Size = 0 then
    Exit; // -->
  SetLength(data, _Stream.Size);
  if _Stream.read(data[0], _Stream.Size) <> _Stream.size then
    raise Exception.Create('Fehler beim Lesen der Daten');
 
  SetLength(search, 6);
  search[0] := $58;
  search[1] := $50;
  search[2] := $52;
  search[3] := $30;
  search[4] := $00;
  search[5] := $28;

  for i := Low(Data) to High(Data) - Length(search) + 1 do begin
    fnd := True;
    for j := Low(search) to High(Search) do begin
      if data[i] <> search[j] then begin
        fnd := False;
        break; // -->
      end;
    end;
    if fnd then begin
      Result := True;
      _Stream.Position := i;
      Exit; // ->
    end;
  end;
end;

fringer 4. Mär 2018 10:30

AW: Hexwert in Binärdatei suchen und Position ermitteln
 
@brechi

vielen Dank für deine Funktion. Ich habe diese mal in mein Programm
eingearbeitet. Beim ausführen bekomme ich jedoch einen FOR-Schleifen
Fehler "FOR Schleifenvariable muss vom ordinalen Typ sein), daher
habe ich aus den Variablen "i" und "j" den Datentyp "integer" anstelle
von "int64" gemacht. Damit läuft die For-Schleife zwar aber die
Funktion gibt nicht mehr das gewünschte Ergebnis aus.

Und ich muss gestehen das ich die Funktion noch nicht komplett verstanden habe. Wäre eine Erläuterung möglich?

Herzlichen Dank und noch einen schönen Sonntag.
fringer

himitsu 4. Mär 2018 11:46

AW: Hexwert in Binärdatei suchen und Position ermitteln
 
Im Prinzip läuft alles auf einen Byte-Vergleich hinaus.
Delphi-Quellcode:
var
  Daten, Suche: TBytes;
  i, i2: Integer;
  B: Boolean;

for i := 0 to Hight(Daten) - High(Suche) do // for i := 0 to Hight(Daten) - (Length(Suche) - 1) do
  for i2 := 0 to High(Suche) do
    if Daten[i] <> Suche[i2] then
      Break
    else if i2 = High(Suche) then
      Gefunden(i);
Die innere Schleife kann man z.B. durch CompareMemory ersetzen
und noch an anderen Stellen bissl optimieren, aber im Prinzip macht so ein Such-Code immer das Gleiche.

Delphi-Quellcode:
for i := 0 to Hight(Daten) - High(Suche) do begin
  {$REGION 'umgedrehte Suchlogik sie Antwort #6'}
  B := False;
  for i2 := 0 to High(Suche) do
    if Daten[i] <> Suche[i2] then
      Break
    else if i2 = High(Suche) then
      B := True;
  {$ENDREGION}
  if B then
    Gefunden(i);
end;
Delphi-Quellcode:
for i := 0 to Hight(Daten) - High(Suche) do
  if CompareMemory(@Daten[i], @Suche[0], Length(Suche)) then
    Gefunden(i);

himitsu 4. Mär 2018 11:51

AW: Hexwert in Binärdatei suchen und Position ermitteln
 
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?
Delphi-Quellcode:
_Stream.ReadBuffer(data[0], _Stream.Size);
> Delphi-Referenz durchsuchenTStream.ReadBuffer entsprechend dem alte Delphi-Referenz durchsuchenBlockRead

HolgerX 4. Mär 2018 12:03

AW: Hexwert in Binärdatei suchen und Position ermitteln
 
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)

himitsu 4. Mär 2018 12:10

AW: Hexwert in Binärdatei suchen und Position ermitteln
 
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

HolgerX 4. Mär 2018 12:31

AW: Hexwert in Binärdatei suchen und Position ermitteln
 
Hmm..


Zitat:

Zitat von fringer (Beitrag 1395011)
ich würde gern in einer binär Datei einen vordefinierten Hexwert suchen (6 bytes) und mir die Position
davon anzeigen lassen.

Würde hier nicht TFileStream besser sein, da mann dann nicht die ganze, eventuell GB große Datei zunächst in einen MemoryStream oder Buffer laden müsste?

Bei kleinen zu durchsuchenden Daten (eventuell schon direkt im Speicher vorhanden) würde die direkte Suche im Memory mit MemoryStream natürlich deutlich performanter sein, da mann dann ohne Read und Positionierung direkt den Speicher per Pointer an CompareMem gegen kann...

himitsu 4. Mär 2018 13:28

AW: Hexwert in Binärdatei suchen und Position ermitteln
 
Alles im Speicher ist einfacher. (mehr als 500 MB werden seine Dateien wohl nicht sein)
Beim stückchenweisem Einlesen muß man beachten, dass Übergreifend gesucht werden muß, also eine Hälfte der Suchdaten kann in einem Block sein und der Rest im nachfolgenden Block.

p80286 4. Mär 2018 20:10

AW: Hexwert in Binärdatei suchen und Position ermitteln
 
Ich hab da was uraltes ausgegraben was mit Ansichar von #0 .. #255 umgehen kann.
Delphi-Quellcode:
(***************************************************************************)
(* Stringsuche in Anlehnung an Boyer Moore                                *)
(***************************************************************************)
(* 1.0  Adaption an 32-Bit Pascal                               2000/06/23*)
(***************************************************************************)
unit boymoore32;

interface
{Alle String-Typen sind klassische Pascal-Strings: Array [0..255] of char!}
{Dies entspricht unter Delphi dem shortstring mit der Definition ist man auf der sicheren Seite}
{Der Array in dem gesucht wird ist 64K groß (noch) }
{ Die "alten" Typen word etc werden noch an 32-Bit Gepflogenheiten angepasst}
{ !!!! Es gibt nur einen Sucharray  !!!           }
type
  sucharraytyp= packed array [0..255] of byte; {packed um Lücken zu vermeiden}
var
  sucharray  : sucharraytyp;

function INITSUCHARR(suchstring:shortstring):boolean;
(*  die 16-Bit version arbeitet mit 16Bit Wörtern
function FINDESTR(sptr:pointer;slang:word;suchstring:shortstring):word;
   die 32-Bit Version mit 32-Bit Integern*)

function FINDESTR(bptr:pointer;blang:integer;suchstring:shortstring):integer;

implementation
function INITSUCHARR(suchstring:shortstring):boolean;
var
  j : word;
begin
  {----- jedem ASCII-Wert die Länge des suchstr zuweisen ------------}
  fillchar(sucharray,sizeof(sucharray),length(suchstring));
  {---- umgekehrt indizieren n...1 !!!!! ----------------------------}
  if length(suchstring)>0 then begin
    INITSUCHARR:=true;
    for j:=1 to length(suchstring) do begin
      sucharray[byte(suchstring[j])]:=length(suchstring)-j;
      sucharray[byte(suchstring[j])]:=sucharray[byte(suchstring[j])];
    end;
  end
  else
    INITSUCHARR:=false;
end;

function FINDESTR(bptr:pointer;blang:integer;suchstring:shortstring):integer;
type
  srt =packed array [1..$FFFF] of byte;
  srtc=packed array [1..$FFFF] of char; { fürs debugging }
var
  bi : integer;    { Index des Source Integer für 32Bit!}
  ssi : integer;    { Index Suchstr   Integer für 32Bit!}
  ssl : integer;    { Länge suchstr   Integer für 32Bit!}
begin
  ssl:=length(suchstring);
  if ssl>blang then                   { Source ist zu klein }
    FINDESTR:=-1                       { nicht gefunden }
  else begin
    bi :=ssl;                         { erste Vergleichspos ist ende SuchS }
    ssi:=ssl;
    repeat
      if sucharray[srt(bptr^)[bi]]>0 then
        inc(bi,sucharray[srt(bptr^)[bi]])
      else begin
        ssi:=ssl;
        repeat
          dec(bi,1);
          dec(ssi,1);
        until (ssi<1) or (srt(bptr^)[bi]<>byte(suchstring[ssi]));
        if ssi>0 then
          inc(bi,ssl-(ssi-1));
      end;
    until (bi>blang) or (ssi<1);
    { Ergebnis für 0-Basierte Arrays}
    if ssi<1 then FINDESTR:=bi
    else FINDESTR:=-1;
  end;
end;
end.
Gruß
K-H

fringer 5. Mär 2018 14:20

AW: Hexwert in Binärdatei suchen und Position ermitteln
 
Vielen Dank für die vielen weiteren Antworten.

Die Funktion von @HolgerX funktioniert soweit. Aber leider nicht mit einem Memorystream bzw. wenn dann die "Nullen" im Stream nicht mitgezählt werden.
Ich werde trotzdem noch einmal versuchen einen Lösungsweg zu finden aber vielleicht ist das ganze auch eine Nummer zu hoch für mich.
Das ganze ist doch wesentlich komplexer als ich dachte.

fringer

Delphi.Narium 5. Mär 2018 15:06

AW: Hexwert in Binärdatei suchen und Position ermitteln
 
Wenn die Routine von HolgerX nicht zum gewünschten Ergebnis führt, dann weicht Deine formulierte Anforderung von Deinem gewünschten Ergebnis ab.

Die Routine macht genau das, was Du als Anforderung geschrieben hast.
Vermutlich meinst Du aber etwas (geringfügig) anderes, als Du geschrieben hast, daher wäre es hilfreich, wenn Du eine Binärdatei und ein konkretes Beispiel dessen, was gesucht werden soll, zur Verfügung stellen könntest.

Eventuell sind dann nur marginale Änderungen an HolgerXs Routine erforderlich oder der Aufbau des zu Suchenden muss verändert oder das zu Suchende in der Routine nur etwas anders interpretiert werden.

fringer 5. Mär 2018 18:16

AW: Hexwert in Binärdatei suchen und Position ermitteln
 
Liste der Anhänge anzeigen (Anzahl: 1)
@Delphi.Narium
Vielen Dank für deine Antwort, es kann vielleicht wirklich sein,
das ich meine Anforderung schlecht ausgedrückt habe.

Daher noch einmal mein Anliegen:

In einer Datei xyz.dat (siehe 7zip-Archiv im Anhang, Virengeprüft!)
soll die Hex-Sequenz "58 50 52 30 00 28" (oder Ansi-Sequenz "XPR0.(" gesucht werden. Wenn diese
gefunden werden sollte, soll die Anfangsposition der Sequenz in der Datei via "showmessage" angezeigt werden.

Im Falle dieser Testdatei wäre es die Position "$0040F7F8".

In einem vorangegangenen Projekt habe ich die Position in einer
in den Stream geladenen Datei so definieren können (Siehe Code unten). Daher dachte
ich muss es auch umgekehrt möglich sein, das ich mir die Position
ausgeben lassen kann indem ich den Stream nach der gesuchten
Hex- oder Ansi-Sequenz durchsuchen lassen kann.


Code:
 

var
  loadstrm : TMemorystream;
  offsetadr : Integer;

...

begin
loadstrm := TMemoryStream.Create;        // Eröffne Stream
offsetadr := $003E1000;                  // Setzte Startadresse
try
loadstrm.LoadFromFile(opendialog1.FileName); // Lade Datei in Stream
loadstrm.Position := offsetadr;              // Gehe in Stream an die Startadresse

...

Delphi.Narium 5. Mär 2018 18:57

AW: Hexwert in Binärdatei suchen und Position ermitteln
 
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.)

HolgerX 5. Mär 2018 23:02

AW: Hexwert in Binärdatei suchen und Position ermitteln
 
Hmm....

Schon hier ist ein Fehler!

Zitat:

Zitat von fringer (Beitrag 1395285)
die Hex-Sequenz "58 50 52 30 00 28" (oder Ansi-Sequenz "XPR0.(" gesucht werden.

Die Hex-Sequenz "58 50 52 30 00 28" ist nicht "XPR0.("!
Die 00 kann nur nicht dargestellt werden, weshalb wohl dein Text-Editor, mit welchem Du die Datei geöffnet hast, diese gegen '.' austauscht..

Wenn Du nach genau dieser Hex-Sequenz in der Datei xyz.dat suchen willst, dann geht folgendes:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
const
  B : Array[0..5] of Byte = ($58, $50, $52, $30, $00, $28); // "XPR0 ("
var
  F : TFileStream;
begin
  F := TFileStream.Create('xyz.dat', fmOpenRead);
  try
    EditPos.Text := IntToStr(FindPosInStream(F,B));
  finally
    F.Free;
  end;
end;
Im Edit steht dann die erste Position der Hex-Sequenz "58 50 52 30 00 28".

Mein Letztes Beispiel (vorheriger Post) zeigte nur das Suchen eines (ANSI) Textes in einem (ANSI) StringStream.
Die FindPosInStream-Funktion arbeitet jedoch mit jedem Stream und sucht darin eine Bytefolge.
Würde ich die Bytefolge z.B. mit 00 58 00 50 00 52 00 30 00 00 00 28 füllen, dann würde im Stream nicht nach einem ANSI-String "XPR0 (" sondern einem WideString "XPR0 (" gesucht. (Kann auch sein, dass die Low/BigEndian Reihenfolge im ByteArray gedeht werden muss ;) )

Delphi.Narium 6. Mär 2018 10:10

AW: Hexwert in Binärdatei suchen und Position ermitteln
 
In meinem Beispiel oben ist übrigens diese Zeile falsch:
Delphi-Quellcode:
A[k] := StrToInt(x);
Da muss man irgendwie aus z. B. FF 255 machen. Und da ist StrToInt irgendwie ungünstig ;-)

Aber wenn man statt HEX-Werten die entsprechenden Dezimalwerte nimmt, sollte es auch so funktionieren.

fringer 7. Mär 2018 11:29

AW: Hexwert in Binärdatei suchen und Position ermitteln
 
Hallo
@HolgerX und @Delphi.Narium,

eure beiden Funktionen funktionieren wunderbar! Habe sie noch einmal ausprobiert. Der Fehler lag bei mir. Ich habe, wie HolgerX schon geschrieben, die Hexadezimale "0"
immer als "." gesucht. Daher kann die Funktion auch keinen Treffer ausgeben. Weiterhin habe ich den Fehler gemacht, das ich mit meinem Stream schon gearbeitet habe
und die Position des Streams nicht mehr "0" war. Die Suchfunktion hatte dann gar nicht die Möglichkeit den gesamten Stream zu durchsuchen, daher kam ich auch
immer zu einem falschen Ergebnis.

Also noch einmal vielen Dank für die Funktionen und vor allem auch für die Erklärungen.
Was nützt einem auch der beste Code-Schnipsel wenn man ihn nicht versteht (auch wenn es manchmal etwas länger dauert) :)
Danke für eure Geduld und vielleicht hilft das auch anderen wenn sie über Google mal danach suchen und diesen Thread hier finden.


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