Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Stringbearbeitung (https://www.delphipraxis.net/38935-stringbearbeitung.html)

valon 26. Jan 2005 12:34


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

alcaeus 26. Jan 2005 12:38

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:
  • Du fuegst leerzeichen ein und arbeitest nach dem obigen Schema
  • Du kopierst immer 2 Zeichen aus dem String und siehst nach, ob der String "00" ist.
Sobald du mal die Anzahl "Zahlen" hast, sollte das Auslesen ein Kinderspiel sein.

Greetz
alcaeus

Luckie 26. Jan 2005 12:38

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

Steve 26. Jan 2005 12:45

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:

valon 26. Jan 2005 12:46

Re: Stringbearbeitung
 
Hi !

Leider sind die Werte nicht durch Leerzeichen getrennt. Ich hab leerzeichen reingemacht, damit es verständlicher wird.

valon 26. Jan 2005 12:54

Re: Stringbearbeitung
 
Hallo!

Danke für eure Antworten.

Steve, die Funktion PosEx(), wo finde ich sie ? Ich arbeite mit Delphi 5.

Danke

Steve 26. Jan 2005 12:56

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:

ibp 26. Jan 2005 13:03

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;

valon 26. Jan 2005 13:05

Re: Stringbearbeitung
 
Danke Leute!

Ich werde es gleich mal ausprobieren.
Danke nochmal.

Steve 26. Jan 2005 13:10

Re: Stringbearbeitung
 
Hi,

Delphi-Quellcode:
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;
Damit kann die '00' auch mitten im String stehen, sie muss bloß innerhalb eines '2er-Blocks' stehen.


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 09:47 Uhr.
Seite 1 von 2  1 2      

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