Encoding/decoding 使用 nanopb 的可选字符串字段

Encoding/decoding optional string fields using nanopb

我有点难以理解如何使用 nanopb 在 protobuf 消息中正确 encode/decode 字符串。发给 encode/decode 的消息看起来像这样:

struct CDAPMessage {
//...
    optional string objName    = 6; // Object name, unique in its class
    optional int64 objInst     = 7; // Unique object instance
//...
}

消息有更多字段,但它们都是同一类型(optional stringoptional int)。

编译后,在.pb.h文件中,我有

typedef struct _CDAPMessage {
//...
    pb_callback_t objName;  /* Object name, unique in its class */
    bool has_objInst;
    int64_t objInst; /* Unique object instance */
//...
}

我想要一个解码整个消息的函数,类似这样的函数:

CDAPMessage *
cdap_decode_msg(void *buf, size_t msg_len)
{ 
    // Allocate space for the decoded message
    CDAPMessage msg = CDAPMessage_init_zero;

    // Create a stream that reads from the buffer.
    pb_istream_t stream = pb_istream_from_buffer(buf, msg_len);

    /* Now we are ready to decode the message. */
    bool status = pb_decode(&stream, CDAPMessage_fields, &msg);

    // Check for errors...
    if (!status) {
        error("Decoding failed: %s\n", PB_GET_ERROR(&stream));
        return NULL; // Returning empty message
    }
    return CDAPMessage;
}

但是,使用这种方法编码整数没有问题,但它不适用于编码字符串(它不会抱怨,只是不编码任何东西)。我想这是因为我应该在 pb_callback_t 结构中为 encode/decode 使用某种函数指针,并在 args 字段中使用字符串值。

我真的找不到一个很好的例子来做我想做的事情,官方文档对我来说有点过分,我不能真正从中得到一些明确的东西。因此,任何指向正确方向的帮助将不胜感激。

如您所述,您需要实现回调机制。
现在,正如@jpa 所建议的那样,如果您有一个已知的最大长度,则可以指定该选项,以便将其作为 char 数组获取。否则,您将需要回调。
有关回调的示例,请参阅 https://github.com/nanopb/nanopb/blob/master/tests/callbacks/decode_callbacks.c
那里有一个示例,说明如何编写回调、如何附加函数指针以及如何解码消息。