basenc 0.2.3

Encoding and decoding hex, base64 and base32 with support for #[no_std].
Documentation

fn decode_nibble(byte: u8) -> Result<u8, crate::Error> {
	match byte {
		b'0'..=b'9' => Ok(byte - b'0'),
		b'a'..=b'f' => Ok(byte - b'a' + 10),
		b'A'..=b'F' => Ok(byte - b'A' + 10),
		_ => Err(crate::Error::InvalidCharacter),
	}
}

pub unsafe fn decode(mut string: &[u8], mut dest: *mut u8) -> Result<*mut u8, crate::Error> {
	while let &[hi, lo, ref rest @ ..] = string {
		*dest = decode_nibble(hi)? << 4 | decode_nibble(lo)?;
		dest = dest.add(1);
		string = rest;
	}

	if string.len() != 0 {
		return Err(crate::Error::IncorrectLength);
	}

	Ok(dest)
}