Python protobuf 解码 base64 字符串

7
我正在尝试从加密的Base64字符串中获取JSON数据。我已经创建了以下样式的proto文件。
syntax = "proto2";

message ArtifactList {
    repeated Artifact artifacts = 1;
}

message Artifact {
    required string id = 1;
    required uint64 type_id = 2;
    required string uri = 3;
}

之后,我使用proto命令生成了Python文件。我正在尝试解密以下的base64字符串。
import message_pb2

import base64
data = base64.b64decode("AAAAAA8KDQgTEBUgBCjln62lxS6AAAAAD2dycGMtc3RhdHVzOjANCg==")

s = str(data)
message_pb2.ArtifactList.ParseFromString(s)

但是我收到以下错误。

Traceback (most recent call last):
  File "app.py", line 7, in <module>
    message_pb2.ArtifactList.ParseFromString(s)
TypeError: descriptor 'ParseFromString' requires a 'google.protobuf.pyext._message.CMessage' object but received a 'str'

我是一个对protobuf不熟悉的新手。我找不到解决这个问题的办法。
有人能帮忙解决这个问题吗?
提前感谢。

1
你为什么删除了我回答的另一个问题? - jps
1
@jps 现在我遇到了这个错误。你有什么想法吗? - az rnd
我遇到了这个错误:google.protobuf.message.DecodeError: Wrong wire type in tag.。有人能帮忙吗? - Sanjiv
@Sanjiv 你在使用Python2还是3? - Chen A.
在调用函数之前打印类型,它可能是 Unicode。 print(type(s)) - Chen A.
显示剩余3条评论
2个回答

4

有两个问题。

  1. ParseFromString 是 ArtifactList 实例的一个方法
  2. ParseFromString 使用类似字节的对象作为参数,而不是 str 类型
>>>import message_pb2
>>>import base64
>>>data = base64.b64decode("AAAAAA8KDQgTEBUgBCjln62lxS6AAAAAD2dycGMtc3RhdHVzOjANCg==")
>>>m=message_pb2.ArtifactList()
>>>m.ParseFromString(data)
>>>m.artifacts
<google.protobuf.pyext._message.RepeatedCompositeContainer object at 0x7fd09a937d68>

1

ParseFromString是protobuf Message实例上的一个方法。

尝试:

message = message_pb2.ArtifactList()
message.ParseFromString(s)

我遇到了这个错误:google.protobuf.message.DecodeError: Wrong wire type in tag. 有人能帮忙吗? - Sanjiv

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接