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:协议缓冲区中标签错误的接线类型错误的主要内容,如果未能解决你的问题,请参考以下文章