2

根据示例,我正在尝试使用 nanopb: https ://github.com/nanopb/nanopb/blob/master/examples/simple/simple.c

缓冲区大小初始化为 128:

uint8_t buffer[128];

我的问题是我怎么知道(提前)这128-length buffer足以传递我的信息?如何在初始(或编码)之前确定适当的(足够但不会因为过大而浪费太多)缓冲区大小?

看起来像一个菜鸟问题:),但感谢您的快速建议。

4

1 回答 1

1

如果可能,nanopb 在生成的.pb.h文件中添加一个定义,该文件具有消息的最大编码大小。在文件中examples/simple/simple.pb.h你会发现:

/* Maximum encoded size of messages (where known) */
#define SimpleMessage_size                       11

并且可以指定uint8_t buffer[SimpleMessage_size];.

仅当所有重复字段和字符串字段都已指定(nanopb).max_count(nanopb).max_size选项时,此定义才可用。

出于许多实际目的,您可以选择一个您估计足够大的缓冲区大小,并处理错误情况。也可以用于pb_get_encoded_size()计算编码大小并动态分配存储空间,但通常这在嵌入式应用程序中不是一个很好的解决方案。当总系统内存大小受到限制时,最好有一个可以测试的恒定大小的缓冲区,而不是让可用的动态内存量在运行时变化。

于 2021-09-27T10:28:04.403 回答