Python Protobuf解码base64字符串

问题描述

我正在尝试从加密的base64字符串中获取JSON数据。我已经创建了如下的原始文件

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. 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>

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...