Енкодер / декодер VarInt
Десяткові значення
Вивід VarInt
Технічні деталі
Як працює кодувальник / декодувальник VarInt
Що робить інструмент
Інструмент VarInt кодує беззнакові цілі числа як змінної довжини цілі числа LEB128 у стилі Protobuf і декодує бінарні потоки VarInt назад у списки цілих чисел. Кожне значення кодується в 1–10 байтів залежно від величини, причому старший біт кожного байта сигналізує, чи йдуть далі байти. Вивід показується як масив байтів, шістнадцяткове представлення або Base64 для зручного вбудовування в тести та фікстури.
Поширені сценарії використання для розробників
Інженери, які налагоджують payload’и wire-format 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, адже відсутній паддинг змінює межі байтів.
Коли використовувати цей інструмент, а коли — код
Використовуйте браузерний інструмент для швидкого перегляду wire-байтів Protobuf під час налагодження або написання тестів. Для продакшн-кодування використовуйте нативні для мови бібліотеки VarInt (`varint` у npm, `binary.varint` у Go в encoding/binary, `decode_varint` у Python в google.protobuf.internal), які в одному виклику підтримують стримінг, відновлення після помилок і перетворення ZigZag.