(src: &[u8], dst: &'a mut [u8])
| 143 | } |
| 144 | |
| 145 | fn encode<'a>(src: &[u8], dst: &'a mut [u8]) -> Result<&'a str> { |
| 146 | let elen = Self::encoded_len(src); |
| 147 | let dst = dst.get_mut(..elen).ok_or(Error::InvalidLength)?; |
| 148 | |
| 149 | let mut src_chunks = src.chunks_exact(5); |
| 150 | let mut dst_chunks = dst.chunks_exact_mut(8); |
| 151 | |
| 152 | for (s, d) in (&mut src_chunks).zip(&mut dst_chunks) { |
| 153 | d[0] = Self::encode_5bits((s[0] >> 3) & 31); |
| 154 | d[1] = Self::encode_5bits(((s[0] << 2) | (s[1] >> 6)) & 31); |
| 155 | d[2] = Self::encode_5bits((s[1] >> 1) & 31); |
| 156 | d[3] = Self::encode_5bits(((s[1] << 4) | (s[2] >> 4)) & 31); |
| 157 | d[4] = Self::encode_5bits(((s[2] << 1) | (s[3] >> 7)) & 31); |
| 158 | d[5] = Self::encode_5bits((s[3] >> 2) & 31); |
| 159 | d[6] = Self::encode_5bits(((s[3] << 3) | (s[4] >> 5)) & 31); |
| 160 | d[7] = Self::encode_5bits(s[4] & 31); |
| 161 | } |
| 162 | |
| 163 | // The last chunk, which may have padding |
| 164 | let src_rem = src_chunks.remainder(); |
| 165 | let dst_rem = match dst_chunks.next() { |
| 166 | Some(d) => d, |
| 167 | None => dst_chunks.into_remainder(), |
| 168 | }; |
| 169 | |
| 170 | if Self::PADDED { |
| 171 | for byte in dst_rem.iter_mut() { |
| 172 | *byte = b'='; |
| 173 | } |
| 174 | } |
| 175 | |
| 176 | let mut b = [0u8; 4]; |
| 177 | b[..src_rem.len()].copy_from_slice(src_rem); |
| 178 | |
| 179 | if !src_rem.is_empty() { |
| 180 | dst_rem[0] = Self::encode_5bits((b[0] >> 3) & 31); |
| 181 | dst_rem[1] = Self::encode_5bits(((b[0] << 2) | (b[1] >> 6)) & 31); |
| 182 | } |
| 183 | |
| 184 | if src_rem.len() >= 2 { |
| 185 | dst_rem[2] = Self::encode_5bits((b[1] >> 1) & 31); |
| 186 | dst_rem[3] = Self::encode_5bits(((b[1] << 4) | (b[2] >> 4)) & 31); |
| 187 | } |
| 188 | |
| 189 | if src_rem.len() >= 3 { |
| 190 | dst_rem[4] = Self::encode_5bits(((b[2] << 1) | (b[3] >> 7)) & 31); |
| 191 | } |
| 192 | |
| 193 | if src_rem.len() == 4 { |
| 194 | dst_rem[5] = Self::encode_5bits((b[3] >> 2) & 31); |
| 195 | dst_rem[6] = Self::encode_5bits((b[3] << 3) & 31); |
| 196 | } |
| 197 | |
| 198 | debug_assert!(src_rem.len() <= 4); |
| 199 | debug_assert!(str::from_utf8(dst).is_ok()); |
| 200 | |
| 201 | Ok( |
| 202 | // SAFETY: `dst` is fully written and contains only valid one-byte UTF-8 chars |
nothing calls this directly
no test coverage detected