![]() |
Stringbearbeitung
Hallo Leute! Ich habe da ein kleines Problem!
Ich bekomme einen String von der seriellen Schnittstelle ,der Form: " 11 AC 33 44 00 " . 11,AC,33,44 sind werte die ich auslesen muss, und die immer 2 hex Zeichen lang sind. 00 kennzeichnet das Ende der Werte. es können mehrere Werte drinstehen. z.b "11 AC 33 44 1F 00". Die Anzahl der Werte ist also variabel. wie kann ich den Index herausfinden, bis wohin die Werte gehen. im beispiel oben wäre das der Index vom wert 4. Da aber ein String auch so ausehen könnte "11 10 01 11 00" , hab ich dann ein Problem den, die Folge 00 kommt im String 2 mal vor "10 01" und am ende 00. Er würde mir dann den falschen index zurückliefern, da er die Folge 00 im "10 01" als Ende interpretiert. Hat jemand ne Idee wie ich da eine Funktion implementieren könnte , die das richtige Ende erkennt und den richtigen Index liefert? Ich hoffe ich habs euch einigermaßen Verständlich rüberbringen können. Danke |
Re: Stringbearbeitung
Hallo valon,
sind im String die Werte durch ein Leerzeichen getrennt oder nicht? Wenn ja, dann brauchst du nur nach "00" suchen, da ein Leerzeichen die Kombination "1001" sprengt. Sind keine Leerzeichen enthalten, dann hast du 2 Optionen:
Greetz alcaeus |
Re: Stringbearbeitung
Nein die Fiolge kommt nur einmal vor: "0 0" <> "00". Oder sind die Werte nicht durch Leerzeichen getrennt? Dann lies doch immer zwei Zeichen ein und wenn beide Zeichen 00 sind dann bist du am Ende.
Delphi-Quellcode:
if (s[1] = '0') and (s[2] = '0') then zuende
|
Re: Stringbearbeitung
Hi,
nicht getestet, aber sowas in der Richtung sollte funktionieren:
Delphi-Quellcode:
Function GetEnd(CONST aCheckString: String) : Integer;
var ii, jj : Integer; // ii : Fundstelle von '00' // jj : Hilfswert für "Offset" in PosEx begin ii := 0; jj := 0; REPEAT jj := ii + 1; ii := PosEx('00',aCheckString,jj); UNTIL (ii=0) OR Odd(ii); result := (ii+1) DIV 2; // 2-er Blöcke "zusammenfassen" end; edit: Davon ausgehend, dass keine Leerzeichen drin sind... edit: Deklarationen vergessen Gruß Stephan :dance: |
Re: Stringbearbeitung
Hi !
Leider sind die Werte nicht durch Leerzeichen getrennt. Ich hab leerzeichen reingemacht, damit es verständlicher wird. |
Re: Stringbearbeitung
Hallo!
Danke für eure Antworten. Steve, die Funktion PosEx(), wo finde ich sie ? Ich arbeite mit Delphi 5. Danke |
Re: Stringbearbeitung
Hi,
die gibt's afaik erst ab D6 oder D7 :? Schau mal in der OH... sollte aber -wenn überhaupt- in der Unit StrUtils sein... Gruß Stephan :dance: |
Re: Stringbearbeitung
Delphi-Quellcode:
function getindex(CONST aCheckString: String): Integer;
var l:byte; begin l:=length(aCheckString)-2; // anzahl der zeichen ohne "00" if (l div 2) = (l/2) then result:= l div 2 // index else result:= -1; // rückgabe für fehlerbehandlung end; |
Re: Stringbearbeitung
Danke Leute!
Ich werde es gleich mal ausprobieren. Danke nochmal. |
Re: Stringbearbeitung
Hi,
Delphi-Quellcode:
Damit kann die '00' auch mitten im String stehen, sie muss bloß innerhalb eines '2er-Blocks' stehen.
function GetIndex00(const aCheckString: String) : Integer;
var ii, jj : integer; begin ii:=1; // Beim ersten Zeichen beginnen jj:=0; // Bisher keine Fundstelle repeat // Zeichenkette prüfen if copy (aCheckString,ii,2) ='00' then jj:=ii; // Fundstelle merken inc(ii,2); // 2 Zeichen weiter until (odd(jj)) or (ii>=length(aCheckString)); // 2-er Blöcke result := (jj+1) div 2; end; PS: "GetIndex" liefert bei '112233405500' 5 zurück, obwohl '00' der sechste Block ist! ;) Gruß Stephan :dance: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:37 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