pub fn xor_byte_arrays(a: &[u8], b: &[u8]) -> Result<Vec<u8>, String> {
if a.len() != b.len() {
return Err("Arrays must be of the same length".to_string());
}
Ok(a.iter().zip(b.iter()).map(|(&x, &y)| x ^ y).collect())
}
pub fn left_pad_str(input: &str, length: usize, padding_char: char) -> String {
if input.len() >= length {
input.to_string()
} else {
let padding = length - input.len();
let padding_string: String = std::iter::repeat(padding_char).take(padding).collect();
padding_string + input
}
}
pub fn right_pad_str(input: &str, length: usize, padding_char: char) -> String {
if input.len() >= length {
input.to_string()
} else {
let padding = length - input.len();
let padding_string: String = std::iter::repeat(padding_char).take(padding).collect();
input.to_string() + &padding_string
}
}
pub fn transform_nibbles_to_af(input: &[u8]) -> Vec<u8> {
let mut output = Vec::with_capacity(input.len());
for &byte in input {
let high_nibble = (byte >> 4) & 0x0F;
let transformed_high = transform_nibble(high_nibble);
let low_nibble = byte & 0x0F;
let transformed_low = transform_nibble(low_nibble);
let output_byte = (transformed_high << 4) | transformed_low;
output.push(output_byte);
}
output
}
fn transform_nibble(nibble: u8) -> u8 {
match nibble {
0..=5 => nibble + 10, 6..=9 => nibble + 6, _ => nibble, }
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_xor_byte_arrays() {
let a = [0b1010, 0b1100, 0b1111];
let b = [0b0101, 0b0011, 0b1010];
let expected_result = vec![0b1111, 0b1111, 0b0101];
assert_eq!(xor_byte_arrays(&a, &b), Ok(expected_result));
let c = [0b1010, 0b1100];
assert_eq!(
xor_byte_arrays(&a, &c),
Err("Arrays must be of the same length".to_string())
);
}
#[test]
fn test_left_pad_str() {
let input = "123";
let length = 6;
let padding_char = '0';
let expected_result = "000123".to_string();
assert_eq!(left_pad_str(input, length, padding_char), expected_result);
let input2 = "abcdef";
let length2 = 4;
let padding_char2 = '-';
assert_eq!(left_pad_str(input2, length2, padding_char2), input2);
}
#[test]
fn test_right_pad_str() {
let input = "123";
let length = 6;
let padding_char = '0';
let expected_result = "123000".to_string();
assert_eq!(right_pad_str(input, length, padding_char), expected_result);
let input2 = "abcdef";
let length2 = 4;
let padding_char2 = '-';
assert_eq!(right_pad_str(input2, length2, padding_char2), input2);
}
#[test]
fn test_transform_nibbles_to_af() {
let input = vec![0x45, 0x82, 0x1A, 0xBC, 0x09, 0x34];
let expected_output = vec![0xEF, 0xEC, 0xBA, 0xBC, 0xAF, 0xDE];
let result = transform_nibbles_to_af(&input);
assert_eq!(
result, expected_output,
"Nibbles were not correctly transformed to A-F range."
);
}
}