2015-11-19 3 views
2

Пытается разобрать сообщение с сервера, который передает тип проводки в качестве группы запуска. Я использую protobuf-c lib, в котором начальная группа и конечная группа не поддерживаются (последние). Есть ли какие-либо примеры того, как работать с типом проводки в качестве стартовой группы, чтобы я мог самостоятельно разобрать сообщениеТип проводки буфера протокола протокола google. Начальная группа и конечная группа

Спасибо заранее

ответ

4

Для фона «группы» - это другой способ представления под-сообщения. Они объявлены как это:

message Foo { 
    repeated group bar = 1 { 
    optional int32 baz = 2; 
    optional string qux = 3; 
    } 
} 

семантически, это почти точно так же, как:

message Foo { 
    repeated Bar bar = 1; 
    message Bar { 
    optional int32 baz = 2; 
    optional string qux = 3; 
    } 
} 

Однако кодирование несколько отличается (описано ниже).

Группы были устаревшими в то время, когда Protobuf был впервые открыт, поэтому многие реализации, отличные от Google, не поддерживают группы. В Google есть очень старые протоколы, которые по-прежнему используют группы, но, вероятно, никто из пользователей Google не должен использовать группы, поэтому я предполагаю, что протокол, с которым вы работаете, является одним из Google. (Если нет, возможно, у вас есть поврежденные данные.)

Предполагаю, вы уже прочитали the encoding docs, но они не объясняют группы.

Группы кодируются, начиная с тега «стартовая группа», за которым следует содержимое под-сообщения, за которым следует соответствующий тег «конечной группы». Это единственный случай в protobufs, где тег появляется в конце значения - во всех остальных случаях тег появляется только в начале.

Напротив, обычные под-сообщения (как во втором примере выше) кодируются с использованием типа провода с разделителями длины: тегом, за которым следует размер под-сообщения, а затем содержимое. Обратите внимание, как кодирование с разделителями по длине означает, что вы можете пропустить под-сообщение без разбора всех его полей; с группой, единственный способ узнать, где заканчивается группа, - анализировать каждое поле, пока не увидите тег конечной группы.

+0

Спасибо за информацию, которая мне очень помогает. – user3232919