nanopb使用oneof编码时payload未写入流、编码大小异常问题
问题根因
- 核心错误为
which_payload赋值不符合nanopb的oneof编码规则:nanopb中which_<oneof名称>字段需要填入父消息中对应oneof分支的专属tag常量,你当前填入的WifiCredResult2_ip_tag是子消息WifiCredResult2内部ip字段的tag,编码逻辑无法识别oneof的选中分支,因此直接跳过了payload部分的写入,导致编码数据大小不符合预期。 - 次要潜在问题:你Proto定义中
ToAppMessage2的错误字段名为error,但代码中赋值的是esp_error,需要确认生成的C结构体字段名是否匹配,否则该字段赋值会无效,甚至可能污染其他字段内存。
修复方案
将nano_pb_test函数中对应赋值行修改为正确的oneof分支tag:
// 错误写法 // toAppMessage2.which_payload = WifiCredResult2_ip_tag; // 正确写法,常量名规则为 <父消息名>_<oneof名>_<分支名>_tag toAppMessage2.which_payload = ToAppMessage2_payload_wifi_tag;
如果生成的常量名有差异,可直接查看nanopb生成的.pb.h头文件中对应分支tag的定义确认。
验证效果
修改后重新运行代码:
pb_get_encoded_size返回的大小会增加payload对应字段的编码长度- 解码输出的
ip值会变为你设置的3232235920,而非默认值12
内容的提问来源于stack exchange,提问作者elcuco
相关产品推荐
相关产品推荐

