wire_varint library
Varint (LEB128) and ZigZag encoding/decoding for protobuf wire format.
These functions implement the unsigned varint encoding (LEB128) and signed integer ZigZag encoding used by Protocol Buffers.
No imports beyond implicit dart:core. All operations use only standard
Dart integer arithmetic, bitwise ops, and list manipulation — primitives
that map directly to Ball std base functions.
References:
- https://protobuf.dev/programming-guides/encoding/#varints
- https://protobuf.dev/programming-guides/encoding/#signed-ints
Test vectors:
encodeVarint([], 0) → 0
encodeVarint([], 1) → 1
encodeVarint([], 127) → 127
encodeVarint([], 128) → 128, 1
encodeVarint([], 300) → 172, 2
encodeVarint([], 150) → 150, 1 (official docs example)
encodeZigZag32(0) → 0
encodeZigZag32(-1) → 1
encodeZigZag32(1) → 2
encodeZigZag32(-2) → 3
decodeZigZag(0) → 0
decodeZigZag(1) → -1
decodeZigZag(2) → 1
Functions
-
decodeVarint(
List< int> buffer, int offset) → Map<String, int> -
Decodes a varint (LEB128) from
bufferstarting atoffset. -
decodeZigZag(
int n) → int - ZigZag-decodes an unsigned integer back to its signed representation.
-
encodeVarint(
List< int> buffer, int value) → List<int> -
Appends the varint-encoded (LEB128) representation of
valuetobuffer. -
encodeZigZag32(
int n) → int - ZigZag-encodes a signed 32-bit integer.
-
encodeZigZag64(
int n) → int - ZigZag-encodes a signed 64-bit integer.