1use crate::ALPHABET;
2
3pub fn encode(input: &[u8]) -> String {
4 let leading_zeroes = input.iter().take_while(|&&b| b == 0).count();
5
6 let mut digits: Vec<u8> = Vec::new();
7
8 for &byte in input {
9 let mut carry = u32::from(byte);
10
11 for digit in digits.iter_mut() {
12 let acc = u32::from(*digit) * 256 + carry;
13 *digit = (acc % 58) as u8;
14 carry = acc / 58;
15 }
16
17 while carry > 0 {
18 digits.push((carry % 58) as u8);
19 carry /= 58;
20 }
21 }
22
23 let mut output = String::with_capacity(leading_zeroes + digits.len());
24
25 for _ in 0..leading_zeroes {
26 output.push('1');
27 }
28
29 for &d in digits.iter().rev() {
30 output.push(ALPHABET[d as usize] as char);
31 }
32
33 output
34}