2017-10-10 4 views
-1

Ich arbeite in einer mqtt-Anwendung und wenn ich die Informationen der Nutzlast von der mqtt-Broker erhalten und versuchen, es von der void *, das ist message-> Payload zu einem int als zu konvertierenUmwandlung von void * in int in C++

signed int var_1=*((int*) message->payload); 

statt es auf die Anzahl der Umwandlung sie es in ein anderes konvertiert, um zu sehen, das ich den folgenden Code verwenden:

printf("Message:%s\n",message->payload); 
printf("Message:%i\n",var_1); 

Welche zeigt:

Message:-58 
Message:3683629 

Ich dachte auch über die Nutzlast eine Zeichenfolge zu sein, aber wenn ich die stoi Funktion verwenden, es gibt mir den Fehler:

can not convert from ´void*´ to ´int´ with stoi function. 
+0

was fragen Sie hier genau? was soll "message-> Payload" eigentlich sein? ein Puffer, der "int" oder ASCII-String darstellt? –

+1

Die eigentliche Frage ist, wie wird die Nachricht gesendet? Der Absender hat etwas getan, um eine Nutzlast aus seinen Daten zu erstellen. Sie müssen diesen Prozess umkehren. –

+0

'anstatt es in die Zahl umzuwandeln, die es in eine andere umwandelt. 'Was ist die Zahl, die Sie dann erwartet haben? – user2079303

Antwort

0

ich nicht ganz verstehen, wenn message-> Nutzlast die Nummer selbst oder eine hält String-Darstellung dafür. Wenn message-> payload den Speicherplatz enthält, in dem die Nummer gespeichert ist, so enthält var_1 den Wert. Daher können Sie nicht erwarten, dass diese Werte identisch sind. In Bezug auf stoi - es empfängt eine Zeichenfolge, die Nummer, aber als Zeichenfolge enthalten. Zum Beispiel -

std::string num = "1234"; 
int convertedNumber = stoi(num); 
1

In C++ können Sie nicht automatisch const void*-const char* konvertieren.

Sie benötigen eine explizite statische Besetzung:

int i=atoi(static_cast<const char*>(message->payload)); 

Hinweis Ich habe atoi() verwendet, die eine Funktion C-Bibliothek (#include <cstdlib>).

Es ist wenig sinnvoll, es in eine std::string zu konvertieren, nur um das zu einem int zu analysieren.

All dies setzt voraus, dass Sie richtigerweise denken, dass die Nutzlast eine zeichencodierte dezimale Ganzzahl in einer c-style Zeichenfolge ist.

1

[I] try to convert it from the void* ... to an int .

OK. Der erste Schritt besteht darin, den Typ des Objekts zu ermitteln, das transportiert wird. Da die Dokumentation von MQTT sagt:

MQTT is data-agnostic and it totally depends on the use case how the payload is structured. It’s completely up to the sender if it wants to send ...


as

signed int var_1=*((int*) message->payload); 

Nun, dies ist richtig, wenn der Zeiger auf ein Objekt vom Typ int. Es ist eine vernünftige Schätzung, aber Sie sollten nicht - außer als letztes Mittel - für die Art des Objekts raten. Sie sollten den Absender untersuchen, indem Sie Dokumentation oder Code lesen, um den Typ des spitzen Objekts herauszufinden.

instead of converting it to the number it is converting it to another one

Also entweder haben Sie den falschen Wert erwartet, oder Sie haben den Typ falsch geraten. Die Lösung besteht darin, nicht mehr zu raten und den richtigen Typ herauszufinden.


I also thought about the payload being a string, but if I use the stoi function it gives me the error:

can not convert from ´void*´ to ´int´ with stoi function. 

Der Fehler scheint außergewöhnlich klar. Das Argument von stoi ist const std::string& str, nicht void*. void* ist nicht implizit in std::string konvertierbar. Wie genau eine solche Konvertierung durchgeführt wird, hängt davon ab, welche Art von Objekt auf void* zeigt (oder manchmal, welche Art von Daten es enthält enthält).

Verwandte Themen