google.protobuf.message.DecodeError: Неправильный тип провода в теге Ошибка в буфере протокола

Я пытаюсь расшифровать свои данные, используя буфер протокола Google в python

файл sample.proto:-

syntax = "proto3";

message SimpleMessage {
string deviceID = 1;
string timeStamp = 2;
string data = 3;
 }

После этого я сгенерировал файлы Python с помощью команды proto: - 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: Неправильный тип провода в теге Ошибка

Что я делаю неправильно. кто-нибудь может помочь?


person Sanjiv Kumar    schedule 19.02.2021    source источник
comment
Как вы получили зашифрованные данные?   -  person gwenzek    schedule 25.02.2021
comment
@gwenzek: - Он зашифрован из буфера протокола. Фактические данные в формате json   -  person Sanjiv    schedule 25.02.2021


Ответы (1)


Ваши данные не зашифрованы, они просто закодированы в 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, а не двоично-сериализованный буфер протокола, чего и ожидает ParseFromString. Кроме того, глядя на имена и типы полей, похоже, что эта полезная нагрузка просто не соответствует показанному вами прототипу определения.

Конечно, есть способы преобразовать JSON в прототип и даже в управляет именами полей в этом преобразовании, но даже количество полей не совпадает напрямую. Итак, сначала вам нужно определить, что вы хотите: какое прото-сообщение вы ожидаете от этого объекта JSON?

person Rafael Lerm    schedule 26.02.2021