python - google.protobuf.message.DecodeError : Wrong wire type in tag Error in Protocol Buffer

标签 python python-3.x jsondecoder protocol-buffers

我尝试在 python 中使用 google protocol buffer 解密我的数据

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:标记错误中的线路类型错误

我做错了什么。有人可以帮忙吗?

最佳答案

您的数据没有“加密”,它只是进行了 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 数据,不是二进制序列化的 Protocol Buffer - 这是 ParseFromString 所期望的。另外,查看字段的名称和类型,看起来此有效负载与您显示的原型(prototype)定义不匹配。

当然有很多方法可以将 JSON 解析为原型(prototype),甚至解析为 control the field names在该转换中,但甚至字段数量也不直接匹配。因此,您首先需要定义您想要的内容:您希望这个 JSON 对象代表什么原始消息?

关于python - google.protobuf.message.DecodeError : Wrong wire type in tag Error in Protocol Buffer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66276140/

相关文章:

python - IF 语句格式化 Python

python - 使用 TensorFlowEstimator 进行增量训练

python - 每个组中包含特定值的新数据框

python - 在Python中比较整数中的数字

json - 如何使用 JSONDecoder 解码未知类型的 JSON?

php - 从 PHP 7.1.x 迁移到 PHP 7.2.x json_decode() 更改

iOS - JSONSerialization VS JSONDecoder 和使用

python - Numpy,沿数组维度应用函数列表

python - wxPython 中的 OnInit 和 __init__

Python:使用检查创建函数签名