Skip to main content

neco_base58/
encode.rs

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}