Python protobuf декодирует строку base64

#python #proto

#python #прото

Вопрос:

Я пытаюсь получить данные JSON из зашифрованной строки base64. Я создал свой прото-файл, как показано ниже

 syntax = "proto2";

message ArtifactList {
    repeated Artifact artifacts = 1;
}

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

После этого я сгенерировал файлы python с помощью команды proto. Я пытаюсь расшифровать строку 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. почему вы удалили другой вопрос с моим ответом?

2. @jps Я задал вопрос, который был неправильным. Вот почему я удалил это. Но ваш ответ правильный.

3. У вас есть какие-либо идеи относительно этого вопроса?

4. @jps Теперь я получаю эту ошибку. У вас есть какие-либо идеи?

5. Я получаю эту ошибку:- google.protobuf.message.DecodeError: Wrong wire type in tag. . Кто-нибудь может помочь

Ответ №1:

Есть две проблемы.

  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>
  

Ответ №2:

ParseFromString — это метод для экземпляра сообщения protobuf.

Попробуйте:

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

Комментарии:

1. Я получаю эту ошибку:- google.protobuf.message.DecodeError: Wrong wire type in tag. кто-нибудь может помочь?