![]() |
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. |
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 ;) .
|
Re: Bestimmte Bytefolge erkennen
Also :
Am einfachsten machst du das mit einem Byte Array.
Delphi-Quellcode:
Ist Blind gecoded und die Function Decimalwertvon must halt noch machen, aber das kann ja der win Taschenrechner auch schon.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; |
Re: Bestimmte Bytefolge erkennen
Decimalwertvon('AB') = $AB
;) \\Edith meint, dass sogar ein StrToInt('AB') geht. |
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. |
Re: Bestimmte Bytefolge erkennen
Code:
(sonst gibt's 'ne Exception) :zwinker:
StrToInt('[color=#ff0000][b]$[/b][/color]AB')
|
Re: Bestimmte Bytefolge erkennen
Danke für die Anregung.
Ich habe die Idee so bei mir implementier:
Delphi-Quellcode:
Klappt wunderbar. :wink:
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; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:13 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