2016-02-25 2 views
-1

2^29 -1? Потому что «Номера полей 1-15 имеют 1-байтовый тег».
32-байт не имеют метки? Я знаю 3 байта, но почему у нас нет тега?почему 2^29-1 является самым большим ключом в буферах протокола

Это что, varint? Я не могу понять исходный код protobuf \ descriptor.cc.

+1

https://developers.google.com/protocol-buffers/docs/reference/cpp/google.protobuf.descriptor – diwangkai

ответ

1

Все поля имеют тег, но для номеров полей 16 и выше тег занимает несколько байтов. Поэтому номера полей от 1 до 15 должны использоваться для наиболее распространенных полей. И да, кодировка varint.

Самый большой ключ - 2^29, поскольку самые низкие 3 бита используются для хранения типа данных поля. Таким образом, 29 + 3 = 32 аккуратно вписывается в uint32_t.

Вы найдете более подробную информацию здесь: https://developers.google.com/protocol-buffers/docs/encoding#structure

+0

самый большой ключ 2^29, где тег? – diwangkai

+0

7 бит на байт, один бит - тег, поэтому 4 * 7 = 28, 28 - самый низкий 3 = 25 не 29 – diwangkai

+0

@diwangkai К сожалению, я не понимаю, что вы пытаетесь сказать. Нет причин ограничивать 7-битное кодирование varint до 4 байтов. И я понятия не имею, что означает «один бит - это тег». – jpa