【问题标题】:Encoding/decoding optional string fields using nanopb使用 nanopb 编码/解码可选字符串字段
【发布时间】:2021-09-22 17:03:31
【问题描述】:

我在理解如何使用 nanopb 正确编码/解码 protobuf 消息中的字符串方面遇到了一些困难。编码/解码的消息如下所示:

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 结构中使用某种函数指针进行编码/解码,以及在 args 字段中使用字符串值。

我真的找不到一个很好的例子来做我想要的,虽然官方文档对我来说有点,但我真的不能从中清楚地了解一些东西。因此,任何指向正确方向的帮助将不胜感激。

【问题讨论】:

  • 您可能希望在字符串字段上定义诸如[(nanopb).max_size = 50] 之类的字段选项,以将其分配为字符数组。
  • 这实际上是一个简单的解决方法,可能适合我的用例。谢谢你的建议:)

标签: c protocol-buffers nanopb


【解决方案1】:

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

【讨论】:

  • 感谢您的链接。我会看看。但是,我可能会选择 char 数组方法,因为我的用例可能没问题
猜你喜欢
  • 2022-01-10
  • 2021-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-25
  • 2019-03-06
  • 1970-01-01
  • 2022-06-10
相关资源
最近更新 更多