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)
}