You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 01:45:01