base64_kenji/
lib.rs

1use std::u8;
2
3#[cfg(test)]
4mod tests;
5
6pub fn base64_encode(input: String) -> String {
7    let bits = get_bits(input);
8
9    let mut res: Vec<char> = Vec::new();
10    for i in 0..bits.len() / 6 {
11        let slice = &bits[i*6..i*6+6];
12        let base64_idx = u8::from_str_radix(slice, 2).expect("Not a binary");
13        res.push(get_base_64_character(base64_idx.into()));
14    }
15
16    res.into_iter().collect::<String>()
17}
18
19fn get_bits(input: String) -> String {
20    let mut bits = input.into_bytes().into_iter().map(|x| {
21        format!("{x:08b}")
22    }).collect::<String>();
23
24    to_sixes(&mut bits);
25    bits
26}
27
28fn to_sixes(bits: &mut String) {
29    let input_length = bits.len();
30    let mut counter = 0;
31    while (input_length + counter) % 6 != 0 {
32        *bits += "0";
33        counter += 1;
34    }
35}
36
37pub fn base64_decode(encoded: String) -> String {
38    let binaries = encoded.chars().into_iter().map(|character| {
39        let idx = get_base_64_index(character).unwrap();
40        format!("{idx:06b}")
41    }).collect::<String>();
42
43    let mut bits: Vec<u8> = Vec::new();
44
45    for i in 0..binaries.len() / 8 {
46        let slice = &binaries[i*8..i*8+8];
47        let binary_character = u8::from_str_radix(slice, 2).expect("Not a binary");
48        bits.push(binary_character);
49    }
50
51    String::from_utf8(bits).unwrap()
52}
53
54fn get_base_64_character(idx: usize) -> char {
55    get_alphabet()[idx]
56}
57
58fn get_base_64_index(character: char) -> Result<usize, isize> {
59    for (i, c) in get_alphabet().iter().enumerate() {
60        if character == *c {
61            return Ok(i);
62        }
63    }
64    return Err(-1);
65}
66
67fn get_alphabet() -> [char;64] {
68    ['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q' ,'R','S','T','U','V','W','X','Y','Z','a','b','c','d','e','f','g' ,'h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w' ,'x','y','z','0','1','2','3','4','5','6','7','8','9','+','/']
69}