Rust base64 encode and decode with validation
Rust
const B64: &[u8; 64] = b"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
fn encode(input: &[u8]) -> String {
let mut out: Vec<u8> = Vec::new();
for chunk in input.chunks(3) {
let n = chunk.iter().copied().fold(0u32, |a, b| (a << 8) | b as u32) << (8 * (3 - chunk.len()));
for i in 0..4 { out.push(if i < (chunk.len() * 8 + 5) / 6 { B64[((n >> (18 - 6 * i)) & 63) as usize] } else { b'=' }); }
}
String::from_utf8(out).unwrap()
}
fn decode(text: &str) -> Result<Vec<u8>, String> {
let data: Vec<u8> = text.bytes().filter(|b| *b != b'=').collect();
if data.len() % 4 == 1 { return Err("invalid base64 length".into()); }
let mut out = Vec::new();
for chunk in data.chunks(4) {
let mut n = 0u32;
for (i, &b) in chunk.iter().enumerate() {
n |= (B64.iter().position(|&c| c == b).ok_or("invalid base64 character")? as u32) << (18 - 6 * i);
}
for i in 0..chunk.len() - 1 { out.push((n >> (16 - 8 * i)) as u8); }
}
Ok(out)
}