我如何提前知道 nanopb 中的缓冲区大小是否足够?
how do i know in advance that the buffer size is enough in nanopb?
我正在尝试使用 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()
来计算编码大小并动态分配存储空间,但通常这在嵌入式应用程序中不是一个很好的解决方案。当总系统内存大小有限时,通常最好有一个可用于测试的恒定大小的缓冲区,而不是让可用的动态内存量在运行时变化。
我正在尝试使用 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()
来计算编码大小并动态分配存储空间,但通常这在嵌入式应用程序中不是一个很好的解决方案。当总系统内存大小有限时,通常最好有一个可用于测试的恒定大小的缓冲区,而不是让可用的动态内存量在运行时变化。