#dwarf #leb128 #read-write #byte-sequences

wasabi_leb128

Read and write the variable length LEB128 number format

2 unstable releases

0.4.0 Mar 6, 2020
0.3.0 Oct 2, 2019

#1731 in Encoding

Download history 219/week @ 2024-07-22 431/week @ 2024-07-29 164/week @ 2024-08-05 322/week @ 2024-08-12 401/week @ 2024-08-19 610/week @ 2024-08-26 357/week @ 2024-09-02 397/week @ 2024-09-09 311/week @ 2024-09-16 193/week @ 2024-09-23 51/week @ 2024-09-30 203/week @ 2024-10-07 152/week @ 2024-10-14 125/week @ 2024-10-21 145/week @ 2024-10-28 191/week @ 2024-11-04

613 downloads per month
Used in shards

MIT license

23KB
296 lines

wasabi_leb128 build status

Read and write the variable length LEB128 number format. For example:

use wasabi_leb128::{ReadLeb128, WriteLeb128};

// Vec<u8> as byte-oriented reader/writer.
let mut buf = Vec::new();

// Encoding/writing a u16 as an LEB128 byte sequence.
let original_value: u16 = 128;
buf.write_leb128(original_value).unwrap();
assert_eq!(buf, [0x80, 0x01]);

// Decoding/reading an LEB128 number back to a u16.
let value: u16 = buf.as_slice().read_leb128().unwrap();
assert_eq!(value, original_value);

For more info, see:


lib.rs:

Read and write the variable length LEB128 number format.

LEB128 ("Little Endian Base 128") is used, for example in DWARF debugging information (see Appenix 4 for C pseudo code) and in the WebAssembly binary format.

Example

use wasabi_leb128::{ReadLeb128, WriteLeb128};

// Vec<u8> as byte-oriented reader/writer.
let mut buf = Vec::new();

// Encoding/writing a u16 as an LEB128 byte sequence.
let original_value: u16 = 128;
buf.write_leb128(original_value).unwrap();
assert_eq!(buf, [0x80, 0x01]);

// Decoding/reading an LEB128 number back to a u16.
let (value, bytes_read): (u16, usize) = buf.as_slice().read_leb128().unwrap();
assert_eq!(value, original_value);

See ReadLeb128 and WriteLeb128 traits for more information.

Related Work

Other open-source implementations of LEB128 numbers:

Differences between this crate and existing Rust implementations in parity-wasm and leb128:

  • Available for all primitive integers (not just u64 or i64).
  • A single, combined implementation for signed/unsigned and all sizes (thanks to num_traits).
  • Proper overflow checking for all target types when parsing.
  • (Hopefully:) easy to understand, comments and explanations inline.

Dependencies

~150KB