google.protobuf.message.DecodeError:协议缓冲区中标签错误的接线类型错误
Posted
技术标签:
【中文标题】google.protobuf.message.DecodeError:协议缓冲区中标签错误的接线类型错误【英文标题】:google.protobuf.message.DecodeError: Wrong wire type in tag Error in Protocol Buffer 【发布时间】:2021-02-19 10:50:11 【问题描述】:我尝试在 python 中使用谷歌协议缓冲区解密我的数据
sample.proto 文件:-
syntax = "proto3";
message SimpleMessage
string deviceID = 1;
string timeStamp = 2;
string data = 3;
之后,我使用 proto 命令生成了 python 文件:-
protoc --proto_path=./ --python_out=./ simple.proto
我的 Python 代码如下:-
import json
import simple_pb2
import base64
encryptedData = 'iOjEuMCwic2VxIjoxODEsInRtcyI6IjIwMjEtMDEtMjJUMTQ6MDY6MzJaIiwiZGlkIjoiUlFI'
t2 = bytes(encryptedData, encoding='utf8')
print(encryptedData)
data = base64.b64decode(encryptedData)
test = simple_pb2.SimpleMessage()
v1 = test.ParseFromString(data)
执行上述代码时出现错误:- google.protobuf.message.DecodeError: Wrong wire type in tag Error
我做错了什么。谁能帮忙?
【问题讨论】:
你是怎么得到加密数据的? @gwenzek:- 它从协议缓冲区加密。实际数据为json格式 【参考方案1】:您的数据没有“加密”,只是经过 base64 编码。如果您使用示例代码并检查您的 data
变量,那么您会得到:
import base64
data = base64.b64decode(b'eyJ2ZXIiOjEuMCwic2VxIjoxODEsInRtcyI6IjIwMjEtMDEtMjJUMTQ6MDY6MzJaIiwiZGlkIjoiUlFIVlRKRjAwMDExNzY2IiwiZG9wIjoxLjEwMDAwMDAyMzg0MTg1NzksImVyciI6MCwiZXZ0IjoiVE5UIiwiaWdzIjpmYWxzZSwibGF0IjoyMi45OTI0OTc5OSwibG5nIjo3Mi41Mzg3NDgyOTk5OTk5OTUsInNwZCI6MC4wfQo=')
print(data)
> b'"ver":1.0,"seq":181,"tms":"2021-01-22T14:06:32Z","did":"RQHVTJF00011766","dop":1.1000000238418579,"err":0,"evt":"TNT","igs":false,"lat":22.99249799,"lng":72.538748299999995,"spd":0.0\n'
这显然是一段 JSON 数据,不是二进制序列化协议缓冲区 - 这是 ParseFromString
所期望的。此外,查看字段的名称和类型,看起来此有效负载与您显示的原型定义不匹配。
当然有一些方法可以将 JSON 解析为 proto,甚至在该转换中解析为 control the field names,但甚至字段数都不能直接匹配。所以你首先需要定义你想要的:你希望这个 JSON 对象代表什么原始消息?
【讨论】:
以上是关于google.protobuf.message.DecodeError:协议缓冲区中标签错误的接线类型错误的主要内容,如果未能解决你的问题,请参考以下文章