我在mqtt应用程序中工作,当我从mqtt代理接收有效负载的信息并尝试将其从void *即message-> payload转换为int
signed int var_1=*((int*) message->payload);
而不是将其转换为将其转换为另一个的数字,看到这个我使用以下代码:
printf("Message:%s\n",message->payload);
printf("Message:%i\n",var_1);
显示:
Message:-58
Message:3683629
我还认为有效载荷是一个字符串,但是如果我使用stoi函数它会给我错误:
can not convert from ´void*´ to ´int´ with stoi function.
答案 0 :(得分:1)
在C ++中,您无法自动从const void*
转换为const char*
。
您需要一个明确的静态强制转换:
int i=atoi(static_cast<const char*>(message->payload));
注意我使用了atoi()
这是一个C库函数(#include <cstdlib>
)。
将其转换为std::string
只需将其解析为int
即可。
所有这些都假设你认为有效载荷是c风格字符串中的字符编码十进制整数是正确的。
答案 1 :(得分:1)
[我]尝试将其从
void*
转换为int
。
行。第一步是弄清楚正在运输的物体的类型。正如MQTT的文档所说:
MQTT与数据无关,它完全取决于用例如何构建有效负载。如果它想发送,完全取决于发件人......
as
signed int var_1=*((int*) message->payload);
现在,如果指针指向int
类型的对象,这是正确的。这是一个合理的猜测,但你不应该猜测 - 除了作为最后的手段 - 对象的类型。您应该通过阅读文档或代码来研究发送者,以找出指向对象的类型。
而不是将其转换为将其转换为另一个的数字
所以,你或者一直在期待错误的价值,或者你猜错了类型。解决方案是停止猜测并找出正确的类型。
我还认为有效载荷是一个字符串,但是如果我使用stoi函数它会给我错误:
can not convert from ´void*´ to ´int´ with stoi function.
错误似乎非常清楚。 stoi
的论点是const std::string& str
,而不是void*
。 void*
无法隐式转换为std::string
。具体如何进行此类转换取决于对象void*
指向的对象类型(有时,包含的数据类型)。
答案 2 :(得分:0)
我不太明白message-&gt;有效负载是否包含数字本身或字符串表示。 如果message-&gt;有效负载包含存储该数字的内存位置,则var_1保存值。 因此,您不能指望这些值是相同的。 关于stoi - 它接收一个包含数字的字符串,但是作为字符串。例如 -
std::string num = "1234";
int convertedNumber = stoi(num);