如何将byte * payload转换为int?

问题描述 投票:0回答:1

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

arduino type-conversion esp8266 data-conversion arduino-esp8266
1个回答
0
投票

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

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

如果你在运行类似软件的两台相同的计算机之间传输二进制文件,那么你可能会很好(只要它永远不会改变),但如果计算机不同或软件不同,你将处理你的整数表示依赖于您正在使用的平台。即使在两端使用不同的语言也许很重要 - 即使Python在相同的处理器上运行,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()将字符串转换为整数很简单。

© www.soinside.com 2019 - 2024. All rights reserved.