如何将byte * payload转换为int?

时间:2019-03-17 23:37:18

标签: arduino type-conversion esp8266 data-conversion arduino-esp8266

我正在使用arduino编写ESP8266th开发板。 我有一个存储在byte * payload中的值。我想转换该值并将其存储到一个int变量中。我尝试了不同的方法,但没有一个能很好地工作。谁能建议我一个好方法?谢谢!!

2 个答案:

答案 0 :(得分:0)

如何执行此操作完全取决于通过MQTT传输值时如何表示该值。

如果您以二进制形式传输它(例如,您将整数发布为一系列字节),那么您还需要知道字节顺序和字节数。最有可能是它的最低有效字节在前(因此,如果十六进制的整数是0x1234,它将作为两个字节传输-0x34,然后是0x12)和32位。

如果您在运行类似软件的两台相同计算机之间传输二进制文件,则可能会很好(只要它永远不会改变),但是如果计算机不同或软件不同,则您要处理的是表示形式取决于您使用的平台的整数。即使在两端使用不同的语言也可能很重要-Python可能以一种方式表示整数,而以C表示另一种方式,即使它们在相同的处理器上运行。

因此,如果您以二进制形式传输,则应该真正选择与机器无关的表示形式。

如果您确实以二进制形式传输并且没有尝试过与机器无关的表示,则代码将类似于:

byte *payload;
int payload_length;
int result;

if(payload_length < sizeof(int)) {
    HANDLE THIS ERROR
} else {
    result = *(int *)payload;
}

这将检查以确保有足够的字节来表示二进制整数,然后使用强制转换从有效负载中检索整数。

如果您以二进制格式以独立于机器的格式进行传输,则您需要进行接收体系结构所需的任何转换。

我真的不建议您以二进制形式传输,除非您知道自己在做什么并且有充分的理由。如今,大多数应用程序都可以以文本形式很好地传输-您可以说是与机器无关的表示形式。

最有可能以二进制形式传输的是文本-可以是与机器无关的格式。如果您将整数作为文本进行传输,则代码将如下所示:

byte *payload;
int payload_length;
char payload_string[payload_length + 1];
int result;

memcpy(payload_string, payload, payload_length);
payload_string[payload_length] = '\0';
result = atoi(payload_string);

此代码使用临时缓冲区将有效负载复制到其中。我们需要将有效载荷视为C字符串,并且C字符串的末尾有一个额外的字节-'\ 0'-表示字符串的末尾。有效负载中没有足够的空间,并且字符串结尾指示符可能已经发送或可能未作为有效负载的一部分发送,因此我们将通过复制有效负载然后添加一个来保证有一个。

之后,只需调用atoi()即可将字符串转换为整数。

答案 1 :(得分:0)

不知道您是否找到答案,但是我遇到了完全相同的问题,最终想到了这个问题:

{{1}}

最后很简单!