The pw_varint module provides functions for encoding and decoding variable length integers, or varints. For smaller values, varints require less memory than a fixed-size encoding. For example, a 32-bit (4-byte) integer requires 1–5 bytes when varint-encoded.

Protocol Buffers use a variable-length encoding for integers.



size_t EncodedSize(uint64_t integer)#

Returns the size of an integer when encoded as a varint. Works on both signed and unsigned integers.

size_t ZigZagEncodedSize(int64_t integer)#

Returns the size of a signed integer when ZigZag encoded as a varint.

uint64_t MaxValueInBytes(size_t bytes)#

Returns the maximum integer value that can be encoded as a varint into the specified number of bytes.

Stream API#

StatusWithSize Read(stream::Reader &reader, int64_t *output)#
StatusWithSize Read(stream::Reader &reader, uint64_t *output)#

Decoders a varint from the current position of a stream. If reading into a signed integer, the value is ZigZag decoded.

Returns the number of bytes read from the stream, places the value in output, if successful. Returns OutOfRange if the varint does not fit in to the type, or if the input is exhausted before the number terminates.

Reads a maximum of 10 bytes.


  • pw_span


To enable pw_varint for Zephyr add CONFIG_PIGWEED_VARINT=y to the project’s configuration.