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

Python反序列化HTTP响应Protobuf返回23的解决方法

问题根因

ParseFromString是Protobuf消息类的实例方法,不会返回解析完成的消息对象,它的作用是原地修改调用该方法的实例、把二进制内容填充到实例字段中,方法本身的返回值是本次解析消耗的二进制字节长度。
你之前的写法resp_msg = HelloReply().ParseFromString(resp.content)属于链式调用:临时创建了一个空的HelloReply实例,调用解析方法填充内容后,把方法返回的字节长度(你的响应二进制刚好长23字节)赋值给了resp_msg,填充好内容的临时实例直接被内存回收,所以你打印resp_msg只能拿到数字23,拿不到预期的Protobuf对象。

修复方案

调整响应解析部分的代码逻辑,分开实例创建和解析调用的步骤,不要接收ParseFromString的返回值:

# 1. 先创建空的响应消息实例
resp_msg = HelloReply()
# 2. 调用解析方法,原地把二进制内容填充到实例中,不需要接收返回值
resp_msg.ParseFromString(resp.content)
# 3. 直接使用填充完成的实例即可
print(resp_msg.message)  # 输出 Hi,py-pb
# 如需转JSON可直接调用之前导入的MessageToJson方法
# print(MessageToJson(resp_msg))
补充验证

你拿到的原始响应内容b'\n\x08Hi,py-pb'完全匹配HelloReply的proto定义:

  • 首字节\n是tag编码,对应proto中定义的序号为1、类型为string的message字段
  • 第二个字节\x08是后续字符串内容的长度,值为8
  • 后续8个字节刚好是Hi,py-pb的二进制编码,解析逻辑本身没有问题,仅为代码写法错误。

内容的提问来源于stack exchange,提问作者WENJUN CHI

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 00:18:15