//! Minimal base64 encoder. Vultr `--userdata` takes base64. We don't pull //! in the `base64` crate for a single call site. const TABLE: &[u8; 64] = b"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; pub fn encode(raw: &[u8]) -> String { let mut out = String::with_capacity((raw.len() + 2) / 3 * 4); for chunk in raw.chunks(3) { let b0 = chunk[0]; let b1 = chunk.get(1).copied().unwrap_or(0); let b2 = chunk.get(2).copied().unwrap_or(0); out.push(TABLE[(b0 >> 2) as usize] as char); out.push(TABLE[(((b0 & 0x03) << 4) | (b1 >> 4)) as usize] as char); out.push(if chunk.len() > 1 { TABLE[(((b1 & 0x0f) << 2) | (b2 >> 6)) as usize] as char } else { '=' }); out.push(if chunk.len() > 2 { TABLE[(b2 & 0x3f) as usize] as char } else { '=' }); } out } #[cfg(test)] mod tests { use super::*; #[test] fn empty() { assert_eq!(encode(b""), ""); } #[test] fn padding() { assert_eq!(encode(b"a"), "YQ=="); assert_eq!(encode(b"ab"), "YWI="); assert_eq!(encode(b"abc"), "YWJj"); } #[test] fn hello() { assert_eq!(encode(b"Hello, World!"), "SGVsbG8sIFdvcmxkIQ=="); } }