#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
кажется излишним, так как логика будет оставаться в цикле, пока эта верхняя часть не равна нулю.