Struct bincode::config::VarintEncoding [−][src]
pub struct VarintEncoding;
Expand description
Variable-size integer encoding (excepting [ui]8).
Encoding an unsigned integer v (of any type excepting u8) works as follows:
- If
u < 251
, encode it as a single byte with that value. - If
251 <= u < 2**16
, encode it as a literal byte 251, followed by a u16 with valueu
. - If
2**16 <= u < 2**32
, encode it as a literal byte 252, followed by a u32 with valueu
. - If
2**32 <= u < 2**64
, encode it as a literal byte 253, followed by a u64 with valueu
. - If
2**64 <= u < 2**128
, encode it as a literal byte 254, followed by a u128 with valueu
.
Then, for signed integers, we first convert to unsigned using the zigzag algorithm, and then encode them as we do for unsigned integers generally. The reason we use this algorithm is that it encodes those values which are close to zero in less bytes; the obvious algorithm, where we encode the cast values, gives a very large encoding for all negative values.
The zigzag algorithm is defined as follows:
fn zigzag(v: Signed) -> Unsigned {
match v {
0 => 0,
v if v < 0 => |v| * 2 - 1
v if v > 0 => v * 2
}
}
And works such that:
assert_eq!(zigzag(0), 0);
assert_eq!(zigzag(-1), 1);
assert_eq!(zigzag(1), 2);
assert_eq!(zigzag(-2), 3);
assert_eq!(zigzag(2), 4);
assert_eq!(zigzag(i64::min_value()), u64::max_value());
Note that u256 and the like are unsupported by this format; if and when they are added to the language, they may be supported via the extension point given by the 255 byte.
Trait Implementations
Auto Trait Implementations
impl RefUnwindSafe for VarintEncoding
impl Send for VarintEncoding
impl Sync for VarintEncoding
impl Unpin for VarintEncoding
impl UnwindSafe for VarintEncoding
Blanket Implementations
Mutably borrows from an owned value. Read more