17 stable releases

2.2.0 Nov 25, 2020
2.1.4 Nov 25, 2020
1.1.5 Nov 23, 2020

#547 in Compression

Download history 27694/week @ 2024-02-01 30427/week @ 2024-02-08 27254/week @ 2024-02-15 41677/week @ 2024-02-22 41456/week @ 2024-02-29 35365/week @ 2024-03-07 33918/week @ 2024-03-14 35625/week @ 2024-03-21 45683/week @ 2024-03-28 45962/week @ 2024-04-04 54188/week @ 2024-04-11 52146/week @ 2024-04-18 50279/week @ 2024-04-25 55573/week @ 2024-05-02 57519/week @ 2024-05-09 47003/week @ 2024-05-16

221,218 downloads per month
Used in 18 crates (6 directly)


273 lines

crates.io docs.rs crates.io


Varint is an alternative way of storing integer numbers.

Varints allow for the storage of larger integer types in a smaller amount of space. It does this by storing an integer using the 7 lower bits and a flag in the most-significant bit. This flag is set to 1 when more bytes should be read. The groups of 7 bits are then added from the least-significant group first.


  • signed (default): allows for signed integers to be encoded and decoded using zigzag encoding
  • std (default): implements the VarintReader and VarintWriter traits respectively on:
    • all std::io::Read implementors
    • all std::io::Write implementors

Note: Disabling the std feature (which is enabled by default) allows for the crate to be used in a #![no_std] environment.


// to allow the use of the `VarintWriter::write_*_varint` functions
use varint_rs::VarintWriter;
// to allow the use of the `VarintReader::read_*_varint` functions
use varint_rs::VarintReader;

// an example to use for the buffer
use std::io::Cursor;

// create an i32 set to `300`
let number: i32 = 300;
// create a buffer for the varint to be writen to
// an i32 can be `4` bytes maximum, so we pre-allocate the capacity
let mut buffer: Cursor<Vec<u8>> = Cursor::new(Vec::with_capacity(4));

// now we can write the varint into the buffer
// `300` should only use `2` bytes instead of all `4`
// the `write_*_varint` functions may return an `std::io::Error`

// we reset the cursor pos back to `0`, this isn't varint stuff

// now we can read the varint from the buffer
// we should read `300` which was the number we stored
// the `read_*_varint` functions may return an `std::io::Error`
let number: i32 = buffer.read_i32_varint().unwrap();

Note: This example assumes that the default features are in use.


Much of this code is ported from the varint crate by Cruz Bishop. A massive thanks to them for the awesome alogrithms!

No runtime deps