# `leb128`

[![](https://img.shields.io/crates/v/leb128.svg)](https://crates.io/crates/leb128)
[![](https://img.shields.io/crates/d/leb128.svg)](https://crates.io/crates/leb128)
[![Rust](https://github.com/gimli-rs/leb128/actions/workflows/rust.yml/badge.svg)](https://github.com/gimli-rs/leb128/actions/workflows/rust.yml)
 [![](https://docs.rs/leb128/badge.svg)](https://docs.rs/leb128)

Read and write DWARF's "Little Endian Base 128" (LEB128) variable length integer
encoding.

The implementation is a direct translation of the pseudocode in the DWARF 4
standard's appendix C.

## Install

Either

    $ cargo add leb128

or add this to your `Cargo.toml`:

    [dependencies]
    leb128 = "0.2.1"

## Example

```rust
use leb128;

let mut buf = [0; 1024];

// Write to anything that implements `std::io::Write`.
{
    let mut writable = &mut buf[..];
    leb128::write::signed(&mut writable, -12345).expect("Should write number");
}

// Read from anything that implements `std::io::Read`.
let mut readable = &buf[..];
let val = leb128::read::signed(&mut readable).expect("Should read number");
assert_eq!(val, -12345);
```

## Documentation

[Documentation](https://docs.rs/leb128)

## Read-Eval-Print-Loop for LEB128

This crate comes with a `leb128-repl` program that you can use after `cargo
install leb128` or by running `cargo run` in clone of this repository.

```
$ leb128-repl
LEB128 Read-Eval-Print-Loop!

Converts numbers to signed and unsigned LEB128 and displays the results in
base-10, hex, and binary.

> 42
# unsigned LEB128
[42]
[2a]
[00101010]

# signed LEB128
[42]
[2a]
[00101010]

> -42
# unsigned LEB128
error

# signed LEB128
[86]
[56]
[01010110]

> 9001
# unsigned LEB128
[169, 70]
[a9, 46]
[10101001, 01000110]

# signed LEB128
[169, 198, 0]
[a9, c6, 0]
[10101001, 11000110, 00000000]

> -9001
# unsigned LEB128
error

# signed LEB128
[215, 185, 127]
[d7, b9, 7f]
[11010111, 10111001, 01111111]

>
```

## License

Licensed under either of

  * Apache License, Version 2.0 ([`LICENSE-APACHE`](./LICENSE-APACHE) or https://www.apache.org/licenses/LICENSE-2.0)
  * MIT license ([`LICENSE-MIT`](./LICENSE-MIT) or https://opensource.org/licenses/MIT)

at your option.

## Contribution

Unless you explicitly state otherwise, any contribution intentionally submitted
for inclusion in the work by you, as defined in the Apache-2.0 license, shall be
dual licensed as above, without any additional terms or conditions.
