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 string
或optional 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
那里有一个示例,说明如何编写回调、如何附加函数指针以及如何解码消息。
我有点难以理解如何使用 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 string
或optional 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
那里有一个示例,说明如何编写回调、如何附加函数指针以及如何解码消息。