diff --git a/src/main.rs b/src/main.rs index a37326f..50b6c9d 100644 --- a/src/main.rs +++ b/src/main.rs @@ -43,7 +43,7 @@ struct AlbumItem { #[derive(Archive, Deserialize, Serialize, Debug, PartialEq)] #[rkyv(compare(PartialEq), derive(Debug))] struct TrackItem { - number_of_strings: u32, + number_of_strings: u32, // number of mhod's count unique_id: u32, visible: u32, filetype: u32, @@ -115,6 +115,18 @@ struct TrackItem { mhii_link: u32 } +#[derive(Archive, Deserialize, Serialize, Debug, PartialEq)] +#[rkyv(compare(PartialEq), derive(Debug))] +struct Entry { // mhod + entry_type: u32, + unk1: u32, + unk2: u32, + position: u32, + length: u32, + unknown: u32, + unk4: u32 +} + enum ChunkState { Header, Data @@ -134,28 +146,57 @@ fn db(data: &[u8]) { }, ChunkState::Data => { let header = chunk_header.unwrap(); + let mut u = 0; + // usize::try_from(header.end_of_chunk).unwrap() - 12 match header.chunk_type { [109, 104, 98, 100] => { //mhbd - info!("val: {:?}", rkyv::access::(&data[i..i+82]).unwrap()); + u = usize::try_from(header.end_of_chunk).unwrap() - 12; + info!("val: {:?}", rkyv::access::(&data[i..i+u]).unwrap()); }, [109, 104, 115, 100] => { //mhsd - info!("val: {:?}", rkyv::access::(&data[i..i+4]).unwrap()); + u = usize::try_from(header.end_of_chunk).unwrap() - 12; + info!("val: {:?}", rkyv::access::(&data[i..i+u]).unwrap()); }, [109, 104, 105, 97] => { // mhla info!("AlbumList"); + u = usize::try_from(header.end_of_chunk).unwrap() - 12; }, [109, 104, 108, 97] => { // mhia - info!("val: {:?}", rkyv::access::(&data[i..i+20]).unwrap()); + u = usize::try_from(header.end_of_chunk).unwrap() - 12; + info!("val: {:?}", rkyv::access::(&data[i..i+u]).unwrap()); }, [109, 104, 108, 116] => { // mhlt info!("TrackList"); + u = usize::try_from(header.end_of_chunk).unwrap() - 12; }, [109, 104, 105, 116] => { // mhit - info!("val: {:?}", rkyv::access::(&data[i..]).unwrap()); + //info!("head: {}, {}", header.end_of_chunk, header.children_count); + u = usize::try_from(header.end_of_chunk).unwrap() - 12; + info!("val: {:?}", rkyv::access::(&data[i..i+u]).unwrap()); + }, + [109, 104, 111, 100] => { // mhod + u = usize::try_from(header.children_count).unwrap() - 12; + //info!("head: {}, {}", header.end_of_chunk, header.children_count); + let header_offset: usize = (header.end_of_chunk + 4) as usize; + let str_end: usize = (header.children_count - 12) as usize; + let entry = rkyv::access::(&data[i..]).unwrap(); + info!("val: {:?}", &entry); + let mut bytes = Vec::new(); + + let mut h = i+header_offset; + while h < i+str_end { + if data[h] != 0 { + bytes.push(data[h]); + } + h+=1; + } + //info!("bytes: {:?}", &data[i+header_offset..i+str_end]); + let g = String::from_utf8(bytes).unwrap(); + info!("str: {}", g); } _ => return } - i += usize::try_from(header.end_of_chunk).unwrap() - 12; + i += u; chunk_header = None; ChunkState::Header }