more byte conversion code and tests

This commit is contained in:
2025-06-02 09:12:16 -04:00
parent 5b17fa777a
commit 60232b958f
5 changed files with 182 additions and 4 deletions
-4
View File
@@ -1,4 +0,0 @@
fn main() {
println!("Taxation is Theft");
println!("MANIFEST_DIR: {}", env!("CARGO_MANIFEST_DIR"));
}
+1
View File
@@ -1,2 +1,3 @@
pub mod test_loader;
pub mod test_compression;
pub mod number_system_conversion;
+97
View File
@@ -0,0 +1,97 @@
pub struct NumberSystemConversion {}
impl NumberSystemConversion {
/// byte_to_bool
///
/// Convert a u8 byte into a set of bool of the value
///
/// ex: 0xff -> true, true, true, true, true, true, true, true
/// 0xa0 -> true, false, true, false, false, false, false, false
pub fn byte_to_bool(from: u8) -> [bool; 8] {
let mut return_values = [false; 8];
for i in 0..8 {
let new_value = from >> i & 0x1 == 1;
return_values[i as usize] = new_value;
}
return_values
}
/// bool_to_byte
///
/// Convert a set of bool to a single byte
///
/// ex: true, true, true, true, true, true, true, true -> 0xff
/// true, false, true, false, false, false, false, false -> 0xa0
/// false, false, false, false, false, false, false, false -> 0x00
pub fn bool_to_byte(from: [bool; 8]) -> u8 {
let mut return_value = 0u8;
for i in 0..from.len() {
let new_bit = 0x1 << i;
if from[i] {
return_value |= new_bit
}
}
return_value
}
/// swap_endian_u16
///
/// Swaps endianness of a u16
///
/// ex: 0xabcd -> 0xcdab
/// 0x00ff -> 0xff00
pub fn swap_endian_u16(from: u16) -> u16 {
// shift low to high and high to low
// merge the bits to a u16
(from & 0xff) << 8 | (from & 0xff00) >> 8
}
/// Swap endian u32
///
/// Swaps endianness of a u32
///
/// ex. 0x12345678 -> 0x78563412
pub fn swap_endian_u32(from: u32) -> u32 {
let mut bytes = vec![0, 0, 0, 0];
// mask out what we want...
bytes[0] = from & 0x000000ff;
bytes[1] = (from & 0x0000ff00) >> 8;
bytes[2] = (from & 0x00ff0000) >> 16;
bytes[3] = (from & 0xff000000) >> 24;
// ...shift it into the right position
bytes[0] << 24 | bytes[1] << 16 | bytes[2] << 8 | bytes[3]
}
/// split_bytes_u16
///
/// Splits a u16 into its high and low bytes
///
/// ex: 0xabcd -> 0xab, 0xcd
/// 0x0000 -> 0x00, 0x00
/// 0xffff -> 0xff, 0xff
pub fn split_bytes_u16(from: u16) -> (u8, u8) {
let high = from.rotate_left(8) as u8;
let low = (from & 0xff) as u8;
(high, low)
}
/// join_bytes_u16
pub fn join_bytes_u16(high: u16, low: u16) -> u16 {
low | high << 8
}
pub fn join_bytes_u16_from_u8(high: u8, low: u8) -> u16 {
low as u16 | ((high as u16) << 8)
}
pub fn split_bytes_u32(from: u32) -> (u16, u16) {
let mut bytes = vec![];
bytes[0] = (from & 0xffff) as u16;
bytes[1] = ((from & 0xffff0000) >> 16) as u16;
(bytes[0], bytes[1])
}
pub fn split_bytes_u32_4(from: u32) -> (u8, u8, u8, u8) {
(0, 0, 0, 0)
}
}