CoderTools

Инструмент Protocol Buffers

Кодирование, декодирование и валидация Protocol Buffers сообщений

Proto-схема

Примеры схем:

Ввод

Парсите схему и выберите тип сообщения для генерации полей формы

Вывод

Документация Protocol Buffers

Что такое Protocol Buffers?

Protocol Buffers (Protobuf) - это языконезависимый, платформонезависимый расширяемый механизм для сериализации структурированных данных, разработанный Google. Он меньше, быстрее и проще, чем XML и JSON для сериализации данных.

Ключевые особенности

  • Языконезависимый и платформонезависимый
  • Меньше и быстрее, чем XML/JSON
  • Строгая типизация с определением схемы
  • Обратная и прямая совместимость
  • Автоматическая генерация кода
  • Эффективное бинарное кодирование

Как использовать этот инструмент

  1. Введите определение .proto схемы в редакторе схем
  2. Нажмите Парсить схему для валидации и парсинга схемы
  3. Выберите тип сообщения, с которым хотите работать
  4. Для кодирования: Введите JSON данные и нажмите Кодировать
  5. Для декодирования: Введите бинарные данные и нажмите Декодировать
  6. Используйте простое декодирование для анализа бинарных данных без схемы

Возможности инструмента

Кодирование

Преобразование JSON данных в бинарный формат Protocol Buffers. Поддерживает ввод на основе форм для удобного ввода данных с валидацией типов.

Декодирование

Преобразование бинарных данных Protocol Buffers обратно в читаемый JSON формат. Поддерживает форматы ввода Base64, Hex и Hex в стиле C.

Простое декодирование

Анализ бинарных данных protobuf без схемы. Полезно для отладки, обратной разработки или анализа неизвестных сообщений.

Ввод через форму

Удобный интерфейс формы, который генерирует формы ввода на основе вашей схемы. Поддерживает вложенные сообщения, перечисления и повторяющиеся поля.

Справочник по синтаксису Proto

Protocol Buffers использует простой синтаксис для определения типов сообщений:

syntax = "proto3";

message Person {
    string name = 1;
    int32 id = 2;
    string email = 3;
    
    enum PhoneType {
        MOBILE = 0;
        HOME = 1;
        WORK = 2;
    }
    
    message PhoneNumber {
        string number = 1;
        PhoneType type = 2;
    }
    
    repeated PhoneNumber phones = 4;
}
  • syntax: Указывает версию protobuf (proto2 или proto3)
  • message: Определяет тип сообщения с полями
  • field: Каждое поле имеет тип, имя и уникальный номер
  • enum: Определяет типы перечислений
  • repeated: Отмечает поле как повторяющееся (массив/список)
  • optional: Отмечает поле как необязательное (proto3)

Скалярные типы

Protocol Buffers поддерживает различные скалярные типы:

Тип Описание По умолчанию
int32, int64Целые числа со знаком (кодирование переменной длины)0
uint32, uint64Целые числа без знака0
sint32, sint64Целые числа со знаком с кодированием ZigZag (эффективно для отрицательных чисел)0
fixed32, fixed64Целые числа без знака фиксированной ширины (4 или 8 байт)0
sfixed32, sfixed64Целые числа со знаком фиксированной ширины (4 или 8 байт)0
float, doubleЧисла с плавающей точкой (32 или 64 бита)0.0
boolЛогические значения (true/false)false
stringТекстовые строки в кодировке UTF-8""
bytesПроизвольные бинарные данныеempty

Wire-типы

Protobuf использует wire-типы для определения способа чтения значений из бинарных данных:

Wire-тип Значение Используется для
0Varintint32, int64, uint32, uint64, sint32, sint64, bool, enum
164-bitfixed64, sfixed64, double
2Length-delimitedstring, bytes, embedded messages, packed repeated
532-bitfixed32, sfixed32, float

Лучшие практики

  • Используйте синтаксис proto3 для новых проектов - он проще и более широко поддерживается
  • Сохраняйте номера полей стабильными - никогда не используйте повторно или не изменяйте номера существующих полей
  • Используйте осмысленные имена полей, которые чётко описывают данные
  • Резервируйте номера полей 1-15 для часто используемых полей (они используют 1 байт)
  • Используйте ключевое слово 'repeated' для массивов/списков значений
  • Определяйте перечисления для полей с фиксированным набором возможных значений

Часто задаваемые вопросы

В чём разница между proto2 и proto3?

Proto3 упрощает синтаксис, убирая обязательные поля - все поля по умолчанию необязательные. Также изменяются значения по умолчанию и убирается обнаружение присутствия полей для скалярных типов. Proto3 рекомендуется для новых проектов.

Можно ли декодировать protobuf без схемы?

Да! Используйте функцию 'Простое декодирование' для анализа бинарных данных без схемы. Имена полей будут показаны как номера (field_1, field_2 и т.д.), и некоторая информация о типах может быть неоднозначной.

Почему мои закодированные данные отличаются от ожидаемых?

Кодирование Protobuf детерминировано, но значения по умолчанию (0, false, пустые строки) обычно не кодируются в proto3 для экономии места. Также порядок полей в JSON не влияет на бинарное кодирование.

Как обрабатывать вложенные сообщения?

Определите вложенные сообщения в вашей схеме и используйте вложенные JSON объекты. В режиме формы нажмите кнопку вложенного поля, чтобы открыть диалог для редактирования вложенных данных.

Распространённые случаи использования

  • Межсервисная коммуникация в микросервисах (gRPC)
  • Хранение данных и кэширование
  • Конфигурационные файлы
  • Сетевые протоколы и API

Справочные материалы