payload (byte) to char

Moin,

ich versuche verzweifelt die payload in ein char[] zu casten.

//payload = "123456789"

void MQTT::on_incommingSubcribe(char* topic, byte* payload, unsigned int length){
  //argument
  char* arg = new char[length];
  for (size_t i = 0; i < length; i++) {
    arg[i] = (char)(payload[i]);
  }

Nach der Schleife erhalte ich in arg auch die entsprechenden Daten,
alldings hängt hinten zu viel drann....

123456789r:

Ich nehme an, dass hat etwas mit der Größe des definierten Arrays zu tun (arg)

Wie macht man es richtig?

Gruß
Pf@nne

Ich nehme an, Dein payload ist nicht ordentlich mit '\0' abgeschlossen.

//payload = "123456789"

void MQTT::on_incommingSubcribe(char* topic, byte* payload, unsigned int length){
  //argument
  char* arg = new char[length+1];
  for (size_t i = 0; i < length; i++) {
    arg[i] = (char)(payload[i]);
  }
  arg[length] = '\0';

Wenn Du die Routine ein paar mal aufgerufen hast, ist Dein RAM verbraucht, denn new char[length+1] alloziiert Speicher, der nicht wieder frei gegeben wird.

Warum willst Du es eigentlich umschreiben? byte und char sind bis auf die Interpretation bzw. die Vorzeichenbetrachtung gleich. Es sind beides 8-bit-Zahlen.

Gruß Tommy

Moin Tommy,

das ist nur ein Auszug, unten hänget ein:

if (arg != NULL) delete[] arg;

drann.....

Ich bekomme per TCP ein Telegramm mit payload.
In meinem Fall ist da lediglich ein String drinn.....
Um aber damit intern weiter zu arbeiten möchte ich die einzelnen Bytes gerne in ein Char[] casten.

Wenn ich das payload[] weiter verwende steht doch in einem Byte der ASCCII-Code des Buchstaben.
Wie soll ich denn damit weiterarbeite?

Grundsätzlich funktioniert es ja, nur ist die Größe von arg[] scheinbar falsch definiert.
Übergeben wird mir die Länge des payload in Bytes.
Müsste dann nciht auch arg[] so groß werden?

Bzw. wenn 11 Bytes gesendet werden passen die ja in ein Array[10],
wo mache ich den Gedankenfehler?

Gruß
Pf@nne

Ja gut, wenn du schon genau weißt, was schief läuft, warum reparierst du das nicht.....

Oder könnte es sein, dass der Fehler ganz woanders steckt?
Z.B. in der Idee?

Ich meine nur, warum sollte man wollen, einen c-String in ein char Array zu casten?
Das kommt mir sehr komisch vor.

das ist nur ein Auszug,

Keine gute Idee....
Ich verstehe ein Vorhaben ja kaum.
Das "Warum" schon gar nicht.
Und dann noch verstümmelter/untestbarer Code....

Pfanne:
Moin Tommy,

das ist nur ein Auszug, unten hänget ein:

if (arg != NULL) delete[] arg;

drann.....

Ich bekomme per TCP ein Telegramm mit payload.
In meinem Fall ist da lediglich ein String drinn.....
Um aber damit intern weiter zu arbeiten möchte ich die einzelnen Bytes gerne in ein Char[] casten.

Wenn ich das payload[] weiter verwende steht doch in einem Byte der ASCCII-Code des Buchstaben.
Wie soll ich denn damit weiterarbeite?

Grundsätzlich funktioniert es ja, nur ist die Größe von arg[] scheinbar falsch definiert.
Übergeben wird mir die Länge des payload in Bytes.
Müsste dann nciht auch arg[] so groß werden?

Bzw. wenn 11 Bytes gesendet werden passen die ja in ein Array[10],
wo mache ich den Gedankenfehler?

Gruß
Pf@nne

"Wo mache ich den Gedankenfehler?" - An mehreren Stellen.

Ein char ist ein byte mit anderer Betrachtung.

Wenn Du als Zeichen 'A' siehst, steht dort als Dezimalzahl 65, als Hex 0x41, als oktal 0101 und der Prozessor sieht nur binär 01000001.

Das ist alles das Gleiche, nur anders interpretiert. Du hast also schon alles, was Du brauchst.
Wenn Du das Ganze als Zeichenkette ausgeben willst, muss der Prozessor ja wissen, wo das Ende ist. Das wird durch das Zeichen '\0' gekennzeichnet (ein Byte mit dem Wert dezimal 0). Für das brauchst Du hinten dran noch 1 Zeichen Platz.

Bzw. wenn 11 Bytes gesendet werden passen die ja in ein Array[10]

Ganz böser Fehler, der zufällig eine Weile gut gehen kann, je nachdem, was hinter dem Array steht.
Ein Array[10] hat 10 Elemente - von 0 bis 9 - wie willst Du da 11 Elemente rein bekommen?
Wenn Du 11 Nutzzeichen hast, die Du ausgeben willst, brauchst Du ein Array[12] = 11 Nutzzeichen + '\0'.
Weitere Infos zu Zeichenketten in C habe ich hier beschrieben.

Edit: Die Fehleraufzählung erhebt keinen Anspruch auf Vollzähligkeit.

Gruß Tommy

a gut, wenn du schon genau weißt, was schief läuft, warum reparierst du das nicht.....

Weil

char* arg = new char[length-1];

es keine Besserung bringt.

Payload ist doch die Nutzlast des empfangenen Telegramms.
Dieses kann doch nicht nur gültige ASSCII-Zeichen enthalten.
So könnte z.B. auch so etwas ankommen:

"0x00, 0x01, 0x65....."

daher wird payload ja auch als byte definiert.

Ich möchte jetzt doch nur den payload in eine Zeichenkette casten um damit weiter zu arbeiten.
Z.B. habe ich routinen die ein "char* data" übergeben haben möchten.
Da bekomme ich doch kein byte rein....

error: invalid conversion from 'byte* {aka unsigned char*}' to 'char*' [-fpermissive]

Oder könnte es sein, dass der Fehler ganz woanders steckt?
Z.B. in der Idee?

Wo stehe ich denn auf dem Schlauch?
Was mache ich denn bei der Definition der Größe falsch?

Gruß
Marco

Also so....

char* arg = new char[length+1];
  for (size_t i = 0; i < length; i++) {
    Serial.println(String(i) + ": " + String((char)(payload[i])));
    arg[i] = (char)(payload[i]);
  }
  arg[length] = '\0';

Auf jeden Fall, bist du weit vorgeprescht....
Und irgendwo falsch abgebogen.
Das merkt man daran, dass du jetzt nicht weiter kommst.

Du wirst zurück gehen müssen, bis zur Stelle des falschen abbiegens.

So könnte z.B. auch so etwas ankommen:

"0x00, 0x01, 0x65....."

OK!
KA, wo die Daten her kommen...
Aber Bytes können so aussehen.
Was hilft es dir das Zeugs in einen C-String umzuformen, casten, wie du sagst?
Mir ist das nicht ersichtlich.

Ein 0x00 in einem C-String beendet den String.
Und, in deinem Beispiel kommt das Endezeichen sofort zu Anfang.

Nein, ich kann mir nicht vorstellen dass du casten möchtest, obwohl du das dauernd sagst.

Wenn Du davon aus gehst, dass im payload auch nicht darstellbare Zeichen sind, dann musst Du die erst mal bereinigen.
Du musst doch wissen, was Deine Senderoutine sendet. Woher sollen wir das wissen?
Wenn Du die Klasse String noch mit rein ziehst, ist Dein Speicher noch früher am Ende.

Ich glaube, Du musst über das Thema noch mal in Ruhe nachdenken und Dir mal aufschreiben, was von Deinem Sender alles kommen kann. Danach musst Du die Empfangsroutinen aufbauen.

Ein Blick in die Grundlagen wäre auch nicht schädlich.

Gruß Tommy

Vielleicht was es tatsächlich ein wenig schwammig formuliert.....

Was mir fehlte war

Wenn Du das Ganze als Zeichenkette ausgeben willst, muss der Prozessor ja wissen, wo das Ende ist. Das wird durch das Zeichen '\0' gekennzeichnet (ein Byte mit dem Wert dezimal 0). Für das brauchst Du hinten dran noch 1 Zeichen Platz.

Vielen Dank für eure Geduld!

Gruß
Pf@nne