pub fn top_encode_number(x: u64, signed: bool, buffer: &mut [u8; 8]) -> &[u8] {
*buffer = x.to_be_bytes();
if x == 0 {
return &[];
}
if signed && x == u64::MAX {
return &buffer[7..];
}
let negative = signed && buffer[0] > 0x7fu8;
let irrelevant_byte = if negative { 0xffu8 } else { 0x00u8 };
let mut offset = 0usize;
while buffer[offset] == irrelevant_byte {
debug_assert!(offset < 7);
offset += 1;
}
if signed && buffer[offset] >> 7 != negative as u8 {
debug_assert!(offset > 0);
offset -= 1;
}
&buffer[offset..]
}
pub fn universal_decode_number(bytes: &[u8], signed: bool) -> u64 {
if bytes.is_empty() {
return 0;
}
let negative = signed && bytes[0] >> 7 == 1;
let mut result = if negative {
u64::MAX
} else {
0u64
};
for byte in bytes.iter() {
result <<= 8;
result |= *byte as u64;
}
result
}