use crate::{
FORBIDDEN_BYTE,
util::{div_rem255, from_bytes_be},
};
pub fn encode(data: impl AsRef<[u8]>) -> Vec<u8> {
let data = data.as_ref();
if data.is_empty() {
return Vec::new();
}
let leading_zeros = data.iter().take_while(|&&b| b == 0).count();
let core_data = &data[leading_zeros..];
if core_data.is_empty() {
return vec![0; leading_zeros];
}
let mut num = from_bytes_be(core_data);
let capacity = core_data.len() + (core_data.len() / 256) + 4 + leading_zeros;
let mut encoded = Vec::with_capacity(capacity);
while num.len() > 1 || unsafe { *num.get_unchecked(0) } != 0 {
let rem = match div_rem255(&mut num) {
FORBIDDEN_BYTE => 255,
r => r,
};
encoded.push(rem);
}
encoded.resize(encoded.len() + leading_zeros, 0);
encoded
}