您如何做到这一点完全取决于您在通过 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() 将字符串转换为整数就很简单了。