modified: Cargo.toml
modified: src/main.rs
This commit is contained in:
parent
1c19ed059a
commit
833ce97bc4
@ -6,4 +6,4 @@ edition = "2021"
|
||||
[dependencies]
|
||||
env_logger = "0.9"
|
||||
log = "0.4.20"
|
||||
rkyv = "0.8.9"
|
||||
rkyv = { version = "0.8.9", features = ["unaligned", "little_endian"] }
|
||||
|
114
src/main.rs
114
src/main.rs
@ -1,42 +1,86 @@
|
||||
use std::{fs::File, io::Read};
|
||||
use env_logger::Builder;
|
||||
use log::{error, info, LevelFilter};
|
||||
use rkyv::{deserialize, rancor::Error, Archive, Deserialize, Serialize};
|
||||
|
||||
#[derive(Archive, Deserialize, Serialize, Debug, PartialEq)]
|
||||
#[rkyv(compare(PartialEq), derive(Debug))]
|
||||
struct ChunkHeader {
|
||||
chunk_type: [u8; 4],
|
||||
end_of_chunk: u32,
|
||||
children_count: u32
|
||||
}
|
||||
|
||||
#[derive(Archive, Deserialize, Serialize, Debug, PartialEq)]
|
||||
#[rkyv(compare(PartialEq), derive(Debug))]
|
||||
struct Database {
|
||||
unknown: u32,
|
||||
version: u32,
|
||||
children_count: u32,
|
||||
id: u64,
|
||||
unknown1: [u8; 32],
|
||||
language: u16,
|
||||
persistent_id: u64,
|
||||
hash: [u8; 20]
|
||||
}
|
||||
|
||||
#[derive(Archive, Deserialize, Serialize, Debug, PartialEq)]
|
||||
#[rkyv(compare(PartialEq), derive(Debug))]
|
||||
struct DataSet {
|
||||
data_type: u32
|
||||
}
|
||||
|
||||
#[derive(Archive, Deserialize, Serialize, Debug, PartialEq)]
|
||||
#[rkyv(compare(PartialEq), derive(Debug))]
|
||||
struct AlbumItem {
|
||||
chunk_type: [u8; 4],
|
||||
end_of_chunk: u32,
|
||||
total_length: u32,
|
||||
number_of_strings: u32,
|
||||
unknown: u16,
|
||||
album_id_for_track: u16,
|
||||
timestamp: u64,
|
||||
unknown1: u32
|
||||
}
|
||||
|
||||
enum ChunkState {
|
||||
Header,
|
||||
Data
|
||||
}
|
||||
|
||||
fn db(data: &[u8]) {
|
||||
|
||||
/*let header_len = u32::from_le_bytes(data[4..8].try_into().expect("dddd"));
|
||||
let total_len = u32::from_le_bytes(data[8..12].try_into().expect("dddd"));
|
||||
let version = u32::from_le_bytes(data[16..20].try_into().expect("dddd"));
|
||||
let num_children = u32::from_le_bytes(data[20..24].try_into().expect("dddd"));
|
||||
info!("Header length: {}", header_len);
|
||||
info!("Total length: {}", total_len);
|
||||
info!("Version: {}", version);
|
||||
info!("Num children: {}", num_children);*/
|
||||
for i in 0..data.len() {
|
||||
let b = &data[i..i+4];
|
||||
if b == [109, 104, 105, 116] {
|
||||
info!("Found at: {:?}", i);
|
||||
let header_len = u32::from_le_bytes(data[i+4..i+8].try_into().expect("dddd"));
|
||||
let total_len = u32::from_le_bytes(data[i+8..i+12].try_into().expect("dddd"));
|
||||
let str_num = u32::from_le_bytes(data[i+12..i+16].try_into().expect("dddd"));
|
||||
let uuid = u32::from_le_bytes(data[i+16..i+20].try_into().expect("dddd"));
|
||||
let visibility = u32::from_le_bytes(data[i+20..i+24].try_into().expect("dddd"));
|
||||
let mut ft = data[i+24..i+28].to_vec();
|
||||
let type1 = data[i+29];
|
||||
let type2 = data[i+30];
|
||||
let dbid = u64::from_le_bytes(data[i+112..i+120].try_into().expect("sss"));
|
||||
ft.reverse();
|
||||
let file_type = String::from_utf8(ft).unwrap();
|
||||
info!("Header: {}, total: {}, strings: {}, uuid: {}, visibility: {}, file_type: {}, type1: {}, type2: {}, dbid: {}",
|
||||
header_len,
|
||||
total_len,
|
||||
str_num,
|
||||
uuid,
|
||||
visibility,
|
||||
file_type,
|
||||
type1,
|
||||
type2,
|
||||
dbid);
|
||||
let mut state = ChunkState::Header;
|
||||
let mut chunk_header = None;
|
||||
let mut i = 0;
|
||||
while i < data.len() {
|
||||
state = match state {
|
||||
ChunkState::Header => {
|
||||
chunk_header = Some(rkyv::access::<ArchivedChunkHeader, Error>(&data[i..i+12]).unwrap());
|
||||
info!("header: {:?}", chunk_header);
|
||||
i += 12;
|
||||
ChunkState::Data
|
||||
},
|
||||
ChunkState::Data => {
|
||||
let header = chunk_header.unwrap();
|
||||
match header.chunk_type {
|
||||
[109, 104, 98, 100] => { //mhbd
|
||||
info!("val: {:?}", rkyv::access::<ArchivedDatabase, Error>(&data[i..i+82]).unwrap());
|
||||
},
|
||||
[109, 104, 115, 100] => { //mhsd
|
||||
info!("val: {:?}", rkyv::access::<ArchivedDataSet, Error>(&data[i..i+4]).unwrap());
|
||||
},
|
||||
[109, 104, 105, 97] => { // mhla
|
||||
|
||||
},
|
||||
[109, 104, 108, 97] => { // mhia
|
||||
info!("val: {:?}", rkyv::access::<ArchivedAlbumItem, Error>(&data[i..i+32]).unwrap());
|
||||
}
|
||||
_ => return
|
||||
}
|
||||
i += usize::try_from(header.end_of_chunk).unwrap() - 12;
|
||||
chunk_header = None;
|
||||
ChunkState::Header
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -48,7 +92,7 @@ fn main() {
|
||||
.filter(None, LevelFilter::Info)
|
||||
.init();
|
||||
|
||||
let mut f = File::open("ipod/iTunes/iTunesDB").unwrap();
|
||||
let mut f = File::open("D:\\Documents\\iTunes\\iTunesDB").unwrap();
|
||||
let mut buf = Vec::new();
|
||||
match f.read_to_end(&mut buf) {
|
||||
Ok(n) => {
|
||||
|
Loading…
x
Reference in New Issue
Block a user