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
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:
Also immer 8 Hex-Zahlen von 0 bis 255.
Mein Code bisher ist
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
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
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};
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
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 307914
Url: https://administrator.de/contentid/307914
Ausgedruckt am: 24.11.2024 um 22:11 Uhr
8 Kommentare
Neuester Kommentar
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:
Grüße
rubberman
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
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.
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
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
Hier im Forum kennt man die Ergebnisse, wenn "Wrustfinge" auf zu kleinen Tasten herumhauen müssen.
lks
Hallo,
Gruß,
Peter
Zitat von @Lochkartenstanzer:
Hier im Forum kennt man die Ergebnisse, wenn "Wrustfinge" auf zu kleinen Tasten herumhauen müssen.
Gab es da mal nicht die Lösung beim Kauf eines solchen Gerätes? Einen Anspitzer für die Finger....Hier im Forum kennt man die Ergebnisse, wenn "Wrustfinge" auf zu kleinen Tasten herumhauen müssen.
Gruß,
Peter