关于nanopb中pb_istream_from_buffer的bufsize参数取值问询
关于nanopb中
pb_istream_from_buffer的bufsize参数说明 函数定义
pb_istream_t pb_istream_from_buffer(const pb_byte_t *buf, size_t bufsize);
参数说明
buf - 要读取的字节数组指针
bufsize - 字节数组的大小
问题解答
.pb.h中的最大编码尺寸宏是否必须传入?
不是必须。这个宏是编译时生成的、对应消息结构的最大可能编码尺寸,仅当你的缓冲区完全按该尺寸分配,且当前要解析的编码数据刚好填满整个缓冲区时,才适合传入这个宏。针对你的场景应传入什么值?
你的payload最大2048,编码后最大尺寸2051:
- 如果当前要解析的是完整的、达到最大编码尺寸的消息,且缓冲区里的有效数据就是2051字节,传
2051; - 如果实际收到的编码消息长度小于2051(比如某次仅收到1200字节的有效编码数据),必须传入实际的有效数据长度,不能直接传2051,否则会导致nanopb读取超出有效数据范围的内存,引发错误。
- 关于simple.c示例的混淆点
示例中输出缓冲区的写法是用于编码场景:编码前需要预先分配足够容纳最大编码结果的缓冲区,所以用了最大尺寸宏。但解析场景的逻辑不同:输入的bufsize是指当前要解析的有效数据长度,而非缓冲区的总分配大小——哪怕缓冲区分配了2051字节,但实际有效数据只有1000字节,就必须传1000。
内容的提问来源于stack exchange,提问作者Bob
相关产品推荐
相关产品推荐

