根据示例,我正在尝试使用 nanopb: https ://github.com/nanopb/nanopb/blob/master/examples/simple/simple.c
缓冲区大小初始化为 128:
uint8_t buffer[128];
我的问题是我怎么知道(提前)这128-length buffer
足以传递我的信息?如何在初始(或编码)之前确定适当的(足够但不会因为过大而浪费太多)缓冲区大小?
看起来像一个菜鸟问题:),但感谢您的快速建议。
根据示例,我正在尝试使用 nanopb: https ://github.com/nanopb/nanopb/blob/master/examples/simple/simple.c
缓冲区大小初始化为 128:
uint8_t buffer[128];
我的问题是我怎么知道(提前)这128-length buffer
足以传递我的信息?如何在初始(或编码)之前确定适当的(足够但不会因为过大而浪费太多)缓冲区大小?
看起来像一个菜鸟问题:),但感谢您的快速建议。
如果可能,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()
计算编码大小并动态分配存储空间,但通常这在嵌入式应用程序中不是一个很好的解决方案。当总系统内存大小受到限制时,最好有一个可以测试的恒定大小的缓冲区,而不是让可用的动态内存量在运行时变化。