Google protobuf, сопоставьте ожидаемый размер сообщения с байтами, полученными из сетиPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Google protobuf, сопоставьте ожидаемый размер сообщения с байтами, полученными из сети

Сообщение Anonymous »


Чтобы протестировать получение и десериализацию сообщений protobuf, отправленных с сервера, я хотел бы сравнить полученные сетевые байты с ожидаемым размером сериализованного полностью заполненного сообщения. Есть несколько промежуточных шагов «черного ящика», и я хочу проверить, отправляет ли сервер правильное сериализованное сообщение по запросу. Я уже уверял, что полученные байты из сети на самом деле являются сериализованным сообщением, но не ясно, правильное ли оно.

Тем не менее, два сообщения могут иметь одинаковый сериализованный размер, но это крайний случай, и когда я нажму что-то подобное, это будет частью какого-то дальнейшего шага, и я не хочу включать это в этот вопрос.
>
Я использовал protoc с опцией --python_out dir для создания файла X_pb2.py, содержащего определения сообщений из . файл прототипа.

Я подумал о следующих возможных (хакерских) альтернативах:

1.) Перебрать X_pb2.MY_Message().DESCRIPTOR.fields, определить размеры полей по их индивидуальным размерам и суммировать их, чтобы получить ожидаемый размер полностью заполненного сообщения. р> 2.) Перебрать X_pb2.MY_Message().DESCRIPTOR.fields, определить типы полей и инициализировать их случайным образом. Затем просто вызовите X_pb2.MY_Message().ByteSize()

3.) Инициализируйте X_pb2.MY_Message(), сериализуйте его, а затем получите ByteSize()

Однако я столкнулся с некоторыми проблемами:

1.) При использовании этого варианта расчетный ожидаемый размер сериализованного сообщения меньше исходного сообщения, что невозможно. Например. сообщение, состоящее из [int8_t, int32_t, uint32_t], имеет сериализованный размер 5, тогда как сумма размеров типов данных равна 9. Код: sum([x.GetOptions().ByteSize() для x в X_pb2.MY_Message().DESCRIPTOR.fields])

2.) Я не нашел универсального способа сопоставления кодов целочисленных типов с фактическими типами. Нет ничего такого, protobuf.helpers.GetType(x.type), где x — одно из полей X_pb2.MY_Message().DESCRIPTOR.field. В любом случае, эти решения кажутся очень склонными к копированию и вставке.

3.) То же, что и 2.)

Возможно, вы поможете мне найти решение, чтобы я мог утверждать ожидаемый_размер == bytes_received_from_network.
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»