Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Bestimmte Bytefolge erkennen (https://www.delphipraxis.net/83294-bestimmte-bytefolge-erkennen.html)

Neotracer64 30. Dez 2006 15:39


Bestimmte Bytefolge erkennen
 
Das gab es bestimmt schon einmal. Jedoch ist es jedesmal schwer danach zu suchen, wenn man nicht genau weiss wie andere das nennen oder man dieses Prozedere nennt.

Ich möchte bestimmte Bytefolgen innerhalb einer Datei suchen und deren Position bestimmen. Diese Folgen sehen allgemein so aus:

0D ?? ?? 00 00 00|01 5C

Das bedeutet folgendes: Die Fragezeichen können irgendein byte sein und das 6. byte kann entweder 0 oder 1 sein. Die restlichen Bytes sind fest. Kann man das irgendwie einfacher prüfen als bei jedem 0D anzuhalten und die restlichen Bytes zu prüfen?
Ich habe da an einen regulären Ausdruck gedacht, halt nur für Bytes. Geht sowas? Wo finde ich soetwas? Gibt es Funktionen dafür? Oder muss ich das wohl selber implementieren? (Das sind ne Menge verschiedenartige Bytefolgen :shock: ).

Danke im vorraus.

Khabarakh 30. Dez 2006 16:04

Re: Bestimmte Bytefolge erkennen
 
Ich wüsste nicht, dass es so etwas schon gibt, aber es ist doch nur eine lineare Suche mit einer einzigen Schleife, das sollte sich doch schneller schreiben lassen als deine Frage ;) .

Corpsman 30. Dez 2006 16:32

Re: Bestimmte Bytefolge erkennen
 
Also :

Am einfachsten machst du das mit einem Byte Array.

Delphi-Quellcode:

Var F:Tfilestream;
    b:Byte;
    Bytearr:array [0..5] of Byte;
begin
  assignfile(f,Dateiname);
  reset(f);
  while not eof(f) do begin
    f.read(b,sizeof(b)); // Lesen des nächsten Byte
    // Shift im Array
    bytearr[0] := bytearr[1];
    bytearr[1] := bytearr[2];
    bytearr[2] := bytearr[3];
    bytearr[3] := bytearr[4];
    bytearr[4] := bytearr[5];
    Bytearr[5] := b;
    // Nu Prüfst du ob deine Bitfolge in Bytearr ist.
    If (Bytearr[0] = Decimalwertvon('0D')) and
       (Bytearr[3] = Decimalwertvon('00')) and
       (Bytearr[4] = Decimalwertvon('00')) and
       (Bytearr[5] = Decimalwertvon('00')) then begin
      // Was auch immer
    end;
    If (Bytearr[0] = Decimalwertvon('0D')) and
       (Bytearr[3] = Decimalwertvon('00')) and
       (Bytearr[4] = Decimalwertvon('01')) and
       (Bytearr[5] = Decimalwertvon('5C')) then begin
      // Was auch immer
    end;
  end;
  closefile(f);
end;
Ist Blind gecoded und die Function Decimalwertvon must halt noch machen, aber das kann ja der win Taschenrechner auch schon.

dizzy 30. Dez 2006 16:36

Re: Bestimmte Bytefolge erkennen
 
Decimalwertvon('AB') = $AB
;)

\\Edith meint, dass sogar ein StrToInt('AB') geht.

Corpsman 30. Dez 2006 16:49

Re: Bestimmte Bytefolge erkennen
 
Ach ja hatte es fast vergessen.

Mit f.position kannst dann die stelle bekommen an der dein Lesezeiger in der Datei grad ist .
davon must du dann noch 6*sizeof(b) abziehen dann hast die Pos deiner Bytefolge.

himitsu 30. Dez 2006 16:52

Re: Bestimmte Bytefolge erkennen
 
Code:
StrToInt('[color=#ff0000][b]$[/b][/color]AB')
(sonst gibt's 'ne Exception) :zwinker:

Neotracer64 30. Dez 2006 16:58

Re: Bestimmte Bytefolge erkennen
 
Danke für die Anregung.
Ich habe die Idee so bei mir implementier:

Delphi-Quellcode:
procedure TfrmDemDoc.ParsePlayerInfo;
var
  i      : Integer;
  bytearr : array [0..6] of Byte;
  buf    : Byte;
begin
  bytearr[0] := 0;
  bytearr[1] := 0;
  bytearr[2] := 0;
  bytearr[3] := 0;
  bytearr[4] := 0;
  bytearr[5] := 0;
  bytearr[6] := 0;
  For i := 0 To HexEdit.DataSize - 1 Do
    begin
      buf := ord(HexEdit.GetMemory(i));
      bytearr[0] := bytearr[1];
      bytearr[1] := bytearr[2];
      bytearr[2] := bytearr[3];
      bytearr[3] := bytearr[4];
      bytearr[4] := bytearr[5];
      bytearr[5] := bytearr[6];
      bytearr[6] := buf;
      If (Bytearr[0] = ord($0D)) and
         (Bytearr[3] = ord($00)) and
         (Bytearr[4] = ord($00)) and
         ((Bytearr[5] = ord($00)) or (Bytearr[5] = ord($01))) and
         (Bytearr[6] = ord($5C)) then
          begin
            ShowMessage('Gefunden an: ' + IntToHex(i,8));
          end;
    end;
end;
Klappt wunderbar. :wink:


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