Menu
Public repository / master
AkurAI-Framework / crates/crypto/src/hexcodec.rs
Latest change 3aae9f4e85241bcb775c31f5c03094becd3da56a - Pure-Rust UI layer: akurai-ui, akurai-crypto, Tailwind-grade akurai-css by Ólafur Búi Ólafsson
//! Lowercase hex encoding and decoding.
const DIGITS: &[u8; 16] = b"0123456789abcdef";
/// Encode `bytes` as lowercase hex.
pub fn hex(bytes: &[u8]) -> String {
let mut s = String::with_capacity(bytes.len() * 2);
for b in bytes {
s.push(DIGITS[usize::from(b >> 4)] as char);
s.push(DIGITS[usize::from(b & 0x0f)] as char);
}
s
}
/// Decode hex (either case). `None` on odd length or a non-hex character.
pub fn from_hex(s: &str) -> Option<Vec<u8>> {
let bytes = s.as_bytes();
if !bytes.len().is_multiple_of(2) {
return None;
}
bytes
.as_chunks::<2>()
.0
.iter()
.map(|pair| Some(nibble(pair[0])? << 4 | nibble(pair[1])?))
.collect()
}
fn nibble(c: u8) -> Option<u8> {
char::from(c).to_digit(16).map(|d| d as u8)
}