aicher1998
Goto Top

Anfängerproblem mit Substrings und Hexadezimalzahlen

Hallo

Bislang hab ich nur leichte Arduino C++ Sachen gemacht, aber jetzt müsste ich HEX Zahlen in ein Array einsortieren.
Die Deklaration dieses Array sieht wie folgt aus
int data = {0x00,0x3E,0x41,0x41,0x41,0x3E,0x00,0xFF};
Wobei die Werte im Array für mein Problem unrelevant sind.

Ich möchte, dass bei einem String den ich über den seriellen Anschluss bekomme, deren Werte dort einsortiert werden.
Dieser String wird das folgende Format haben:
00FF00FF00FF00FF

Also immer 8 Hex-Zahlen von 0 bis 255.

Mein Code bisher ist
         memset(data, 0, sizeof(data));

          inputString.replace(" ","");  

          int x = 0;
          while (inputString.length() > x*6) {
            //Wieso ist das bei Substring so:
            // 0 bis 6      // Anfang ist null-basiert
            // 6 bis 12 ??  // Ende ist 1-basiert
            String s = inputString.substring(x*6, (x+1)*6);
           
            long number = (long) strtol( &s, NULL, 16);
            byte a = number >> 16;
            byte b = number >> 8 & 0xFF;
            byte c = number & 0xFF;

            Serial.print("a ");Serial.println(a);  
            Serial.print("b ");Serial.println(b);  
            Serial.print("c ");Serial.println(c);  

            data[x*3 + 0] = a;
            data[x*3 + 1] = b;
            data[x*3 + 2] = c;

            x++;
          }

Ich hab ewig gebraucht, um einen Weg zu finden, jetzt wollte ich einfach den String in 6er-Blocks zerlegen und je 3 Zahlen auslesen.
Mein Problem ist jetzt, dass ich das mit dem Index im Substring noch nicht ganz verstanden hab (in C#, VB, ... kann ichs ja). Kann das sein, dass der Startwert 0-basiert ist und der Endwert 1-basiert ist?

Bei einer Eingabe von FF00FF00FF00FF00 erhalte ich

a 255
b 0
c 255
a 0
b 255
c 0
a 0
b 255
c 0


Wie kann das sein, dass die letzten 3 Werte falsch sind?

Hat bitte jemand einen Tipp für mich oder einen besseren Code wie ich das machen könnte? Ich bin sicher, dass es eine Möglichkeit gibt, das ganze hier in wenigen Zeilen zu lösen.

Gruß
Chris

Content-ID: 307914

Url: https://administrator.de/contentid/307914

Ausgedruckt am: 24.11.2024 um 22:11 Uhr

rubberman
Lösung rubberman 23.06.2016 aktualisiert um 02:21:58 Uhr
Goto Top
Hallo Chris.

Sorry, aber was tust du da eigentlich? Du hast einen String, der 8 Bytes repräsentiert. Wie kommst du darauf 8 Bytes in 3x3 Bytes aufteilen zu wollen und was hat es mit 6 und 12 auf sich?
Warum liest du nicht jeweils 2 Zeichen als Substring, konvertierst in einen numerischen Wert und weist ihn dem jeweiligen Arrayelement zu?

Ich habe keine Ahnung von Arduino, nur gerade mal in die Referenz geschielt. Vermutlich sollte das etwa so aussehen:
for (int i = 0; i < 8; ++i)
  data[i] = inputString.substring(i * 2, (i + 1) * 2).toInt();

Grüße
rubberman
Lochkartenstanzer
Lochkartenstanzer 23.06.2016 aktualisiert um 07:59:03 Uhr
Goto Top
Zitat von @Aicher1998:

Ich hab ewig gebraucht, um einen Weg zu finden, jetzt wollte ich einfach den String in 6er-Blocks zerlegen und je 3 Zahlen auslesen.


Irgendwie verstehe ich nicht ganz, was Du da treiben willst.

Mit sedezimalzahlen zu rechnen ist doch recht einfach: Wandel den String einfach in ein 64-bit unsigned integer um und alles wird gut. Und wie man sedezimale Ziffern in zahlen und vice versa wandelt gibt es schon tausende Anleitungen dazu. Und als integer lassen die Dinge rsich viel einfacher sortieren.

lks
Aicher1998
Aicher1998 23.06.2016 um 10:41:01 Uhr
Goto Top
Zitat von @rubberman:

Hallo Chris.

Sorry, aber was tust du da eigentlich? Du hast einen String, der 8 Bytes repräsentiert. Wie kommst du darauf 8 Bytes in 3x3 Bytes aufteilen zu wollen und was hat es mit 6 und 12 auf sich?
Ich bekomme bei length ja nicht 8 sondern die Anzahl der Elemente oder?
Warum liest du nicht jeweils 2 Zeichen als Substring, konvertierst in einen numerischen Wert und weist ihn dem jeweiligen Arrayelement zu?
Ich weiß face-smile
Da ich aber zuerst einen Teil dieses Codes im Internet gefunden hab, wollte ich das ganze erst mal darauf aufbauen.
Das sollte ja nicht die engültige Lösung werden, ich wollte nur wissen, was da falsch ist, wieso die letzten vertauscht sind.

Ich habe keine Ahnung von Arduino, nur gerade mal in die Referenz geschielt. Vermutlich sollte das etwa so aussehen:
> for (int i = 0; i < 8; ++i)
>   data[i] = inputString.substring(i * 2, (i + 1) * 2).toInt();
> 

Was ist der Unterschied zwischen i++ und ++i ?
Aicher1998
Aicher1998 23.06.2016 um 10:45:38 Uhr
Goto Top
Zitat von @Lochkartenstanzer:

Zitat von @Aicher1998:

Ich hab ewig gebraucht, um einen Weg zu finden, jetzt wollte ich einfach den String in 6er-Blocks zerlegen und je 3 Zahlen auslesen.

Irgendwie verstehe ich nicht ganz, was Du da treiben willst.
Der Code stammt teilweise aus dem Internet, da ging es darum den HTML Farb Code FFAAFF in seine Bestandteile zu zerlegen
Das sollte ja nicht die endgültige Lösung werden, ich wollte nur wissen, was da falsch ist, wieso die letzten vertauscht sind.

Mit sedezimalzahlen zu rechnen ist doch recht einfach: Wandel den String einfach in ein 64-bit unsigned integer um und alles wird gut. Und wie man sedezimale Ziffern in zahlen und vice versa wandelt gibt es schon tausende Anleitungen dazu. Und als integer lassen die Dinge rsich viel einfacher sortieren.
Integer auf Arduino hat 16 Bit face-smile Das mit dem Konvertieren hab ich doch schon geschafft: strtol
Lochkartenstanzer
Lochkartenstanzer 23.06.2016 um 10:54:06 Uhr
Goto Top
Zitat von @Aicher1998:

Was ist der Unterschied zwischen i++ und ++i ?

Noch viel lernen Du mußt, junger Padawan würde Meister Joda sagen:

Bei einer Variante wird vor der Evaluierung der Variable inkrementiert, bei der andern danach. Du darfst nun raten, welche Operation was macht.

lks
Aicher1998
Aicher1998 23.06.2016 um 11:06:21 Uhr
Goto Top
Zitat von @Lochkartenstanzer:

muß
So viel zum Lernen =D

Bei einer Variante wird vor der Evaluierung der Variable inkrementiert, bei der andern danach. Du darfst nun raten, welche Operation was macht.
Danke. Wieso frag ich eigentlich anstatt dass ich es selbst ausprobier? =D
Lochkartenstanzer
Lochkartenstanzer 23.06.2016 um 11:25:36 Uhr
Goto Top
Zitat von @Aicher1998:

Zitat von @Lochkartenstanzer:

muß
So viel zum Lernen =D


Hier im Forum kennt man die Ergebnisse, wenn "Wrustfinge" auf zu kleinen Tasten herumhauen müssen. face-smile

lks
Pjordorf
Pjordorf 23.06.2016 um 11:39:57 Uhr
Goto Top
Hallo,

Zitat von @Lochkartenstanzer:
Hier im Forum kennt man die Ergebnisse, wenn "Wrustfinge" auf zu kleinen Tasten herumhauen müssen. face-smile
Gab es da mal nicht die Lösung beim Kauf eines solchen Gerätes? Einen Anspitzer für die Finger....face-smile

Gruß,
Peter