From 097d6a973ca08ccaa86e6bbee95d6f8b67a79d19 Mon Sep 17 00:00:00 2001 From: Jon Janzen Date: Tue, 10 Nov 2020 15:17:08 -0700 Subject: [PATCH] Created binary_loader --- binary_loader/Cargo.toml | 9 +++++ binary_loader/src/lib.rs | 79 ++++++++++++++++++++++++++++++++++++++++ db/Cargo.toml | 1 + db/src/lib.rs | 28 ++++++++++++++ 4 files changed, 117 insertions(+) create mode 100644 binary_loader/Cargo.toml create mode 100644 binary_loader/src/lib.rs diff --git a/binary_loader/Cargo.toml b/binary_loader/Cargo.toml new file mode 100644 index 0000000..4a152d9 --- /dev/null +++ b/binary_loader/Cargo.toml @@ -0,0 +1,9 @@ +[package] +name = "binary_loader" +version = "0.1.0" +authors = ["Jon Janzen "] +edition = "2018" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] diff --git a/binary_loader/src/lib.rs b/binary_loader/src/lib.rs new file mode 100644 index 0000000..ab979af --- /dev/null +++ b/binary_loader/src/lib.rs @@ -0,0 +1,79 @@ +pub fn load_high_u4(raw: u8) -> u8 { + (raw & 0xF0) >> 4 +} + +pub fn load_low_u4(raw: u8) -> u8 { + raw & 0x0F +} + +pub fn load_u8(raw: u8) -> u8 { + raw +} + +pub fn load_u32(raw: [u8; 4]) -> u32 { + let mut value: u32 = 0; + let temp: u32 = raw[0].into(); + value = temp << 24; + let temp: u32 = raw[1].into(); + value |= temp << 16; + let temp: u32 = raw[2].into(); + value |= temp << 8; + let temp: u32 = raw[3].into(); + value |= temp; + value +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn load_0() { + assert_eq!(0, load_u32([0, 0, 0, 0])); + } + + #[test] + fn load_1() { + assert_eq!(1, load_u32([0, 0, 0, 1])); + } + + #[test] + fn load_big() { + assert_eq!(0x01000000, load_u32([1, 0, 0, 0])); + } + + #[test] + fn test_load_low_u4() { + assert_eq!(0x07, load_low_u4(0x07)); + } + + #[test] + fn load_low_u4_with_high_data() { + assert_eq!(0x03, load_low_u4(0x13)); + } + + #[test] + fn load_low_u4_with_only_high_data() { + assert_eq!(0x00, load_low_u4(0x30)); + } + + #[test] + fn test_load_high_u4() { + assert_eq!(0x07, load_high_u4(0x70)); + } + + #[test] + fn load_high_u4_with_low_data() { + assert_eq!(0x01, load_high_u4(0x13)); + } + + #[test] + fn load_high_u4_with_only_low_data() { + assert_eq!(0x00, load_high_u4(0x03)); + } + + #[test] + fn test_load_u8() { + assert_eq!(0x43, load_u8(0x43)); + } +} diff --git a/db/Cargo.toml b/db/Cargo.toml index b85f1d6..8b07935 100644 --- a/db/Cargo.toml +++ b/db/Cargo.toml @@ -7,3 +7,4 @@ edition = "2018" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] +binary_loader = { path = "../binary_loader" } \ No newline at end of file diff --git a/db/src/lib.rs b/db/src/lib.rs index 8fd15ea..8d72543 100644 --- a/db/src/lib.rs +++ b/db/src/lib.rs @@ -6,6 +6,27 @@ struct DBHeader { record_count: u32, } +impl DBHeader { + fn from(raw: [u8; 8]) -> DBHeader { + + let mut reserved : u16 = 0x0000; + reserved = raw[2].into(); + reserved <<= 8; + let temp : u16 = raw[3].into(); + reserved |= temp; + + let mut record_count : u32 = 0x00000000; + + DBHeader { + magic: raw[0], + major_version: (raw[1] | 0xF0) >> 4, + minor_version: (raw[1] | 0x0F), + reserved: reserved, + record_count: record_count, + } + } +} + struct RecordHeader { field_count: u8, length: u8, @@ -23,4 +44,11 @@ mod tests { fn it_works() { assert_eq!(2 + 2, 4); } + + #[test] + fn load_empty_db_header() { + let header = [0xDB, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]; + let db_header = DBHeader::from(header); + assert_eq!(db_header.magic, 0xDB); + } }