(data: &[u8])
| 160 | } |
| 161 | |
| 162 | fn base64_encode(data: &[u8]) -> String { |
| 163 | const CHARS: &[u8] = b"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; |
| 164 | let mut result = String::with_capacity(data.len().div_ceil(3) * 4); |
| 165 | for chunk in data.chunks(3) { |
| 166 | let b0 = chunk[0] as u32; |
| 167 | let b1 = if chunk.len() > 1 { chunk[1] as u32 } else { 0 }; |
| 168 | let b2 = if chunk.len() > 2 { chunk[2] as u32 } else { 0 }; |
| 169 | let n = (b0 << 16) | (b1 << 8) | b2; |
| 170 | result.push(CHARS[((n >> 18) & 0x3F) as usize] as char); |
| 171 | result.push(CHARS[((n >> 12) & 0x3F) as usize] as char); |
| 172 | if chunk.len() > 1 { |
| 173 | result.push(CHARS[((n >> 6) & 0x3F) as usize] as char); |
| 174 | } else { |
| 175 | result.push('='); |
| 176 | } |
| 177 | if chunk.len() > 2 { |
| 178 | result.push(CHARS[(n & 0x3F) as usize] as char); |
| 179 | } else { |
| 180 | result.push('='); |
| 181 | } |
| 182 | } |
| 183 | result |
| 184 | } |
| 185 | |
| 186 | #[cfg(test)] |
| 187 | mod tests { |
no test coverage detected