vu64

Crates.iovu64
lib.rsvu64
version0.1.11
sourcesrc
created_at2021-11-11 13:06:08.52016
updated_at2024-06-09 11:16:53.909874
descriptionvariable length encode/decode for a 64-bits integer
homepage
repositoryhttps://github.com/aki-akaguma/vu64
max_upload_size
id480154
size85,107
(aki-akaguma)

documentation

README

vu64

crate Docs Rust Version Apache2/MIT licensed Test ubu Test mac Test win

The variable length integer encoding of u64. This is a simple and fast encoder/decoder.

Features

  • integer value length compaction
  • minimum support rustc 1.58.1 (db9d1b20b 2022-01-20)

format pattern

Prefix Precision Total Bytes
0xxxxxxx 7 bits 1 byte
10xxxxxx 14 bits 2 bytes
110xxxxx 21 bits 3 bytes
1110xxxx 28 bits 4 bytes
11110xxx 35 bits 5 bytes
111110xx 42 bits 6 bytes
1111110x 49 bits 7 bytes
11111110 56 bits 8 bytes
11111111 64 bits 9 bytes

This format is a like vint64, but 0x00 is represented by 0x00.

Examples

Encode

use vu64::encode;
assert_eq!(encode(0x0f0f).as_ref(), &[0x8F, 0x3c]);

Decode

use vu64::decode;
let slice = [0x8F, 0x3c].as_ref();
assert_eq!(decode(slice).unwrap(), 0x0f0f);

Encode and decode

use vu64::{encode, decode};
let val = 1234;
assert_eq!(decode(encode(val).as_ref()).unwrap(), val);

Read from buffer and decode

use vu64::io::ReadVu64;
let vec: Vec<u8> = vec![0xFF, 0xf0, 0xf0, 0x0f, 0x0f, 0xf0, 0xf0, 0x0f, 0x0f];
let mut crsr = std::io::Cursor::new(vec);
let r = crsr.read_and_decode_vu64();
assert!(r.is_ok());
assert_eq!(r.unwrap(), 0x0f0f_f0f0_0f0f_f0f0);

Encode and write to buffer

use vu64::io::WriteVu64;
let vec_0: Vec<u8> = vec![0xFF, 0xf0, 0xf0, 0x0f, 0x0f, 0xf0, 0xf0, 0x0f, 0x0f];
let vec: Vec<u8> = Vec::new();
let mut crsr = std::io::Cursor::new(vec);
let r = crsr.encode_and_write_vu64(0x0f0f_f0f0_0f0f_f0f0);
assert!(r.is_ok());
assert_eq!(crsr.get_ref().as_slice(), vec_0.as_slice());

Changelogs

This crate's changelog here.

References

License

This project is licensed under either of

at your option.

Commit count: 41

cargo fmt