Энкодер / декодер VarInt
Десятичные значения
Вывод VarInt
Технические детали
Как работает кодировщик / декодировщик VarInt
Что делает инструмент
Инструмент VarInt кодирует беззнаковые целые числа как переменные целые в стиле Protobuf (LEB128) и декодирует бинарные потоки VarInt обратно в списки целых чисел. Каждое значение кодируется в 1–10 байт в зависимости от величины, при этом старший бит каждого байта сигнализирует, следуют ли ещё байты. Вывод показывается как массив байтов, шестнадцатеричное представление или Base64 для удобного встраивания в тесты и фикстуры.
Распространенные сценарии использования для разработчиков
Инженеры, отлаживающие payload'ы wire-формата Protobuf, используют кодирование/декодирование VarInt, чтобы просматривать теги полей и значения беззнаковых целочисленных полей без запуска полноценного рантайма Protobuf. Разработчики Bitcoin и других криптовалют разбирают VarInt-кодированные длины скриптов и количества транзакций. Инструмент также полезен при реверс-инжиниринге пользовательских бинарных протоколов, которые используют LEB128 из-за его компактности для небольших чисел.
Форматы данных, типы или варианты
LEB128 (Little-Endian Base 128) выдаёт 7 полезных бит на байт, а самый значимый бит служит флагом продолжения. Малые числа (0–127) используют один байт; числа до 16 383 — два байта; и так далее. Ввод принимает десятичные числа, разделённые пробелами, запятыми или переводами строк. Вывод доступен в шестнадцатеричном виде, Base64 и в нотации массива сырых байтов. Знаковые целые можно кодировать, предварительно применив преобразование ZigZag (n << 1) ^ (n >> 31).
Распространенные ошибки и крайние случаи
Точность чисел в JavaScript ограничена 2^53 − 1; значения выше Number.MAX_SAFE_INTEGER нельзя безопасно кодировать. Усечённые потоки VarInt (без завершающего байта) декодируются частично и возвращают ошибку с указанием смещения. Отрицательные числа нельзя кодировать напрямую — сначала используйте ZigZag-кодирование. Избегайте копирования байтов VarInt со скриншотов, где могло быть удалено выравнивание Base64, так как отсутствие padding меняет границы байтов.
Когда использовать этот инструмент, а когда — код
Используйте браузерный инструмент для быстрого просмотра wire-байтов Protobuf во время отладки или при написании тестов. Для продакшн-кодирования используйте нативные для языка библиотеки VarInt (`varint` в npm, `binary.varint` в Go в encoding/binary, `decode_varint` в Python в google.protobuf.internal), которые в одном вызове поддерживают потоковую обработку, восстановление после ошибок и преобразование ZigZag.