MCPcopy Create free account
hub / github.com/RustCrypto/formats / encode

Method encode

base32ct/src/encoding.rs:145–208  ·  view source on GitHub ↗
(src: &[u8], dst: &'a mut [u8])

Source from the content-addressed store, hash-verified

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

Callers

nothing calls this directly

Calls 4

encoded_lenFunction · 0.50
nextMethod · 0.45
lenMethod · 0.45
is_emptyMethod · 0.45

Tested by

no test coverage detected