Как работает алгоритм кодирования VarInt?

#byte #buffer #protocols #encode #varint

Вопрос:

Я некоторое время работал над библиотекой, которая требовала кодирования и декодирования неподписанных переменных, но даже после прочтения того, как работает кодировка, я все еще не могу понять это.

Я использовал этот код в качестве ссылки: Кодирование/декодирование Varint

Функция, на которую я ссылаюсь, заключается в следующем:

 public static void writeUnsignedVarInt(int value, DataOutput out) throws IOException {
    while ((value amp; 0xFFFFFF80) != 0L) {
        out.writeByte((value amp; 0x7F) | 0x80);
        value >>>= 7;
    }
    out.writeByte(value amp; 0x7F);
}
 

Меня смущает особенно эта строка

 out.writeByte(value amp; 0x7F);
 

Когда я впервые использовал этот пример, я забыл операцию И в этой строке, но код библиотеки, который охватывал множество крайних случаев, никогда не ломался. В моем рабочем пространстве это выглядело так.

 out.writeByte(value);
 

Меня больше всего интересует, насколько важен «amp; 0x7F»? и в целом, как работает эта функция?

Комментарии:

1. Это метод, в котором вы одновременно записываете/считываете 7 бит фактического значения, а затем используете MSB в качестве флага, указывающего, есть ли больше байтов (больше ненулевых 7-битных фрагментов значения). Последнее amp; 0x7F кажется излишним, так как логика будет оставаться в цикле, пока эта верхняя часть не равна нулю.