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

Я пытаюсь получить данные 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. Я не смог найти решение, чтобы исправить эту проблему.

Может ли кто-нибудь помочь решить эту проблему?

Заранее спасибо.


person az rnd    schedule 08.09.2020    source источник
comment
почему вы удалили другой вопрос с моим ответом?   -  person jps    schedule 08.09.2020
comment
@jps Я задал вопрос, это было неправильно. Вот почему я удалил это. Но ваш ответ правильный.   -  person az rnd    schedule 09.09.2020
comment
У вас есть идеи по этому вопросу?   -  person az rnd    schedule 09.09.2020
comment
@jps Теперь я получаю эту ошибку. Есть ли у вас какие-либо идеи?   -  person az rnd    schedule 09.09.2020
comment
Я получаю эту ошибку: - google.protobuf.message.DecodeError: Wrong wire type in tag.. Может ли кто-нибудь помочь   -  person Sanjiv    schedule 18.02.2021
comment
@Sanjiv, ты используешь python2 или 3?   -  person Chen A.    schedule 20.02.2021
comment
@ChenA.:- Python 3   -  person Sanjiv    schedule 21.02.2021
comment
@Sanjiv печатает тип перед вызовом функции, это может быть юникод. print(type(s))   -  person Chen A.    schedule 21.02.2021


Ответы (2)


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

  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>
person Kim Nyholm    schedule 26.02.2021

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

Пытаться:

message = message_pb2.ArtifactList()
message.ParseFromString(s)
person Nitin    schedule 14.01.2021
comment
Я получаю эту ошибку: - google.protobuf.message.DecodeError: Wrong wire type in tag. кто-нибудь может помочь? - person Sanjiv; 18.02.2021