use alloc::string::String;
pub fn hex_encode(data: &[u8]) -> String {
const HEX: &[u8; 16] = b"0123456789abcdef";
let mut out = String::with_capacity(data.len() * 2);
for &b in data {
out.push(HEX[(b >> 4) as usize] as char);
out.push(HEX[(b & 0x0F) as usize] as char);
}
out
}
#[cfg(test)]
mod tests {
use super::*;
use alloc::format;
use alloc::vec::Vec;
#[test]
fn encodes_lowercase_zero_padded() {
assert_eq!(hex_encode(&[0xDE, 0xAD, 0xBE, 0xEF]), "deadbeef");
assert_eq!(hex_encode(&[0x00, 0x01, 0x0A]), "00010a");
}
#[test]
fn empty_input_is_empty_output() {
assert_eq!(hex_encode(&[]), "");
}
#[test]
fn output_is_always_two_chars_per_byte() {
let all: Vec<u8> = (0..=255u8).collect();
let encoded = hex_encode(&all);
assert_eq!(encoded.len(), all.len() * 2);
let expected: String = all.iter().map(|b| format!("{b:02x}")).collect();
assert_eq!(encoded, expected);
}
}