【问题标题】:How to convert byte*payload to an int?如何将 byte*payload 转换为 int?
【发布时间】:2019-08-08 07:52:54
【问题描述】:

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

【问题讨论】:

  • 您应该考虑添加您尝试过的东西,以便其他人可以更好地理解您要问的是什么,如果没有更多信息,我的猜测是投射取消引用的指针是一种选择,stackoverflow.com/questions/39312058/…

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


【解决方案1】:

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

   payload[length] = '\0'; // Add a NULL to the end of the char* to make it a string.
   int aNumber = atoi((char *)payload);

最后很简单!

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2012-02-05
      • 1970-01-01
      • 2010-11-08
      • 2017-03-18
      • 2011-06-24
      • 1970-01-01
      • 2020-02-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多