hex conversion, now with tests!

This commit is contained in:
2025-08-10 20:35:05 -04:00
parent 33fd08a821
commit db5bf131f7

View File

@@ -44,6 +44,7 @@ pub const fn u8_to_lower_hex(value: u8) -> &'static str {
HEX_TABLE_LOWER[value as usize] HEX_TABLE_LOWER[value as usize]
} }
#[derive(Debug)]
enum EncodeError { enum EncodeError {
VALUE_EXCEEDS_OUTPUT_CAPACITY, VALUE_EXCEEDS_OUTPUT_CAPACITY,
} }
@@ -53,33 +54,106 @@ const fn u8_to_string(
output: &mut [char], output: &mut [char],
table: [&'static str; 256], table: [&'static str; 256],
) -> Result<(), EncodeError> { ) -> Result<(), EncodeError> {
if values.len() * 2 < output.len() { if values.len() * 2 > output.len() {
Err(EncodeError::VALUE_EXCEEDS_OUTPUT_CAPACITY) Err(EncodeError::VALUE_EXCEEDS_OUTPUT_CAPACITY)
} else { } else {
let len = values.len(); let len = values.len();
let mut iter = 0; let mut iter = 0;
while iter < len { while iter < len {
iter += 1;
let value = values[iter as usize] as usize; let value = values[iter as usize] as usize;
let lu = table[value].as_bytes(); let lu = table[value].as_bytes();
let pos = iter * 2; let pos = iter * 2;
output[pos] = lu[0] as char; output[pos] = lu[0] as char;
output[pos + 1] = lu[1] as char; output[pos + 1] = lu[1] as char;
iter += 1;
} }
Ok(()) Ok(())
} }
} }
pub const fn u8_array_to_lower_hex_string( pub const fn u8_array_to_lower_hex_chars(
values: &[u8], values: &[u8],
output: &mut [char], output: &mut [char],
) -> Result<(), EncodeError> { ) -> Result<(), EncodeError> {
u8_to_string(values, output, HEX_TABLE_LOWER) u8_to_string(values, output, HEX_TABLE_LOWER)
} }
pub const fn u8_array_to_upper_hex_string( pub const fn u8_array_to_upper_hex_chars(
values: &[u8], values: &[u8],
output: &mut [char], output: &mut [char],
) -> Result<(), EncodeError> { ) -> Result<(), EncodeError> {
u8_to_string(values, output, HEX_TABLE_UPPER) u8_to_string(values, output, HEX_TABLE_UPPER)
} }
pub fn u8_array_to_lower_hex_string(values: &[u8]) -> Result<String, EncodeError> {
let len = values.len() * 2;
let mut output = Vec::with_capacity(len);
for i in 0..len {
output.push('!');
}
u8_array_to_lower_hex_chars(values, output.as_mut_slice())?;
Ok(String::from_iter(output))
}
pub fn u8_array_to_upper_hex_string(values: &[u8]) -> Result<String, EncodeError> {
let len = values.len() * 2;
let mut output = Vec::with_capacity(len);
for i in 0..len {
output.push('!');
}
u8_array_to_upper_hex_chars(values, output.as_mut_slice())?;
Ok(String::from_iter(output))
}
#[cfg(test)]
pub mod test {
use super::*;
#[test]
fn test_upper_string() {
let expected = "FFFF0001090F";
let input = [255u8, 255, 0, 1, 9, 15];
let convert = u8_array_to_upper_hex_string(&input).unwrap();
assert_eq!(convert, expected);
}
#[test]
fn test_lower_string() {
let expected = "ffff0001090f";
let input = [255u8, 255, 0, 1, 9, 15];
let convert = u8_array_to_lower_hex_string(&input).unwrap();
assert_eq!(convert, expected);
}
#[test]
fn test_lower_hex() {
let expected = "ff";
let input = 255u8;
let convert = u8_to_lower_hex(input);
assert_eq!(convert, expected);
}
#[test]
fn test_upper_hex() {
let expected = "FF";
let input = 255u8;
let convert = u8_to_upper_hex(input);
assert_eq!(convert, expected);
}
}