From daa188eb1d7aee7db9ebe0203a2e45c6e4cdc4e9 Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Fri, 27 Jan 2023 22:12:02 +0100 Subject: [PATCH] io/region: use ChunkArray to parse region header A layout of a ChunkArray:: matches the binary format of the region header. --- Cargo.lock | 7 +++++++ Cargo.toml | 1 + src/io/region.rs | 16 +++++++--------- 3 files changed, 15 insertions(+), 9 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index e1222a5..c45a502 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -20,6 +20,12 @@ version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" +[[package]] +name = "bytemuck" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c041d3eab048880cb0b86b256447da3f18859a163c3b8d8893f4e6368abe6393" + [[package]] name = "byteorder" version = "1.4.3" @@ -202,6 +208,7 @@ name = "minedmap" version = "0.1.0" dependencies = [ "anyhow", + "bytemuck", "clap", "fastnbt", "flate2", diff --git a/Cargo.toml b/Cargo.toml index 6ab5984..1ed267a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -9,6 +9,7 @@ default-run = "minedmap" [dependencies] anyhow = "1.0.68" +bytemuck = "1.13.0" clap = { version = "4.1.4", features = ["derive"] } fastnbt = "2.3.2" flate2 = "1.0.25" diff --git a/src/io/region.rs b/src/io/region.rs index 909e548..332f2cd 100644 --- a/src/io/region.rs +++ b/src/io/region.rs @@ -19,20 +19,18 @@ struct ChunkDesc { len: u8, } -fn parse_header(header: &[u8; BLOCKSIZE]) -> HashMap { +fn parse_header(header: &ChunkArray) -> HashMap { let mut map = HashMap::new(); - for coords in ChunkArray::<()>::keys() { - let chunk = &header[(4 - * (usize::from(CHUNKS_PER_REGION) * usize::from(coords.z.0) - + usize::from(coords.x.0)))..]; + for (coords, &chunk) in header.iter() { + let offset_len = u32::from_be(chunk); - let offset = u32::from(chunk[0]) << 16 | u32::from(chunk[1]) << 8 | u32::from(chunk[2]); + let offset = offset_len >> 8; if offset == 0 { continue; } - let len = chunk[3]; + let len = offset_len as u8; map.insert(offset, ChunkDesc { coords, len }); } @@ -81,9 +79,9 @@ impl Region { let Region { mut reader } = self; let mut chunk_map = { - let mut header = [0u8; BLOCKSIZE]; + let mut header = ChunkArray::::default(); reader - .read_exact(&mut header) + .read_exact(bytemuck::cast_mut::<_, [u8; BLOCKSIZE]>(&mut header.0)) .context("Failed to read region header")?; parse_header(&header)