我尝试在 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/