Учитывая кодирование protobuf Ваше сообщение выглядит следующим образом:
0a .. varint key '1|010' -> field 1, type LENGTH_DELIMITED
10 .. varint length -> 16
Contents:
08 .. varint key '1|000' -> field 1, type VARINT
7f .. varint value -> 127
8a 01 .. varint key '00000010001|010' -> field 17, type LENGTH_DELIMITED
04 .. varint length -> 4
Contents:
08 .. varint key '1|000' -> field 1, type VARINT
02 .. varint value -> 2
10 .. varint key '10|000' -> field 2, type VARINT
03 .. varint value -> 3
92 01 .. varint key '00000010010|010' -> field 18, type LENGTH_DELIMITED
04 .. varint length -> 4
Contents:
08 .. varint key '1|000' -> field 1, type VARINT
02 .. varint value -> 2
10 .. varint key '10|000' -> field 2, type VARINT
03 .. varint value -> 3
18 .. varint key '11|000' field 3, type VARINT
01 .. varint value -> 1
Целочисленное значение для тега поля 17 с разделителями по длине в двоичном виде: 10001|010
(10001
равно 17 и 010
с разделителями по длине тип провода ) -> предоставление 10001010
( двоичный).
Чтобы закодировать это число как varint, вам нужно настроить общую длину в битах, кратную 7 (заполнить нулями):
-> 000000 10001010
Затем разделите его на группы по 7 бит:
-> 0000001 0001010
Затем измените порядок этих групп:
-> 0001010 0000001
И добавить дополнительный бит для каждой группы ( MSB ) - ноль для последней группы и один для всех других групп (MSB, равный 1, говорит парсеру, что существует следующая следующая группа):
-> 1 0001010 0 0000001
Что дает 0x8A 0x01
в шестнадцатеричном (ваше значение).
Расшифровывается кодировка Varint здесь .
Насколько мне известно, конструкция oneof не меняет формат проводника (он расширяет только логику синтаксического анализатора, игнорируя все, кроме последнего поля из одной группы).
Удачи!