From b80b866781bd2edf4aff4a1c9e14df3eb5b4bad3 Mon Sep 17 00:00:00 2001 From: alterwain Date: Sun, 9 Feb 2025 02:29:28 +0300 Subject: [PATCH] modified: src/deserializer.rs modified: src/main.rs modified: src/serializer.rs --- outdb | Bin 15722 -> 15758 bytes src/deserializer.rs | 10 ++++------ src/main.rs | 11 ++++++++--- src/serializer.rs | 4 ++-- 4 files changed, 14 insertions(+), 11 deletions(-) diff --git a/outdb b/outdb index 4b484ca01bd819300d44023a8b640bc364714255..ebc049e5073c72e6c15e185cdc52086185fa52b8 100644 GIT binary patch delta 564 zcmaD=)mN>Mn~{|Ag@J*g&z6CK5lEK+F)I-J@0elMX>lcGqJjno`>kC^ZXZs&GI^uE z=)?y0jX5EVJTgEv$*v1MSMbmOJ~>d&W^#-G2cyGeL8jfDEzArIK*S(B`6`qBN`xiZ)tiWtO(O7Wu1s0acIm}#)jFZcma~WkOKV>eN+#uu4C_m9qm{D$WqLSp~ ztqMt#1GqRC(3ZT0c7+e_gfv|`n znjx2=l%W`?BAG#(p$sUN%#a9FTg(tUxs-J#uQ7uKgB3#*gBL?6L*Qg-w!1tFeTp74 ztvBB;7v3Z|d7qiyLa*~BXtIBhU6>V_3V>6n1F83nY=)ngBj>BupbhZJAFu)`N}Mp_#?B*+FCrIgLDf=s(P6POtofQTV&@>M4Li3cPm>o99G zGEP3gA~HFLnTwHWayfG@W7g!S%q5cr%-JT#>kCahV9b~?(NLH%bK*wv$ro61ES-S* zL2iKo5L*g}VPftK`3#i|3JiG+sSFiB7b`HN07dc{iYCuwoylv+V9H>{5XBJ25Y7-a z*`Dn#4_o1x$J5TP?mDRPWa{JuK@%1ypupsdEHRTm@NsPZBN)NKnhi8QZL*?(GRLXy z{!eCAODazG5l~>v2D%IAxhs?#!7=%O)ETfbsg4<`o@e}ffiBVEVFd>^0|Us3a2J`# z7_cz|MJA^!*|H$ZOs+Fm*sP<>0g*M=v_^pf0&D=|Kd}@5 diff --git a/src/deserializer.rs b/src/deserializer.rs index 6a94aed..ca8f8d3 100644 --- a/src/deserializer.rs +++ b/src/deserializer.rs @@ -89,15 +89,13 @@ pub fn parse_bytes(data: &[u8]) -> XDatabase { let entry: StringEntry = bincode::deserialize(&data[i..i+28]).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; + bytes.push(u16::from_le_bytes(data[h..h+2].try_into().unwrap())); + h+=2; } - let g = String::from_utf8(bytes).unwrap(); + let g = String::from_utf16(&bytes).unwrap(); info!("str: {}", g); match &mut xdb.find_dataset(last_type).child { XSomeList::AlbumList(albums) => { diff --git a/src/main.rs b/src/main.rs index 7dc4894..402c957 100644 --- a/src/main.rs +++ b/src/main.rs @@ -22,7 +22,7 @@ fn main() { .init(); // /Users/michael/Documents/ipod/iTunes/iTunesDB - let mut f = File::open("/Users/michael/Documents/ipod/iTunes/iTunesDB").unwrap(); // D:\\Documents\\iTunes\\iTunesDB + let mut f = File::open("D:\\Documents\\iTunes\\iTunesDB").unwrap(); // D:\\Documents\\iTunes\\iTunesDB let mut buf = Vec::new(); match f.read_to_end(&mut buf) { Ok(n) => { @@ -30,7 +30,12 @@ fn main() { let mut xdb = deserializer::parse_bytes(data); //info!("XDB: {:#?}", xdb); - let unique_id = rand::thread_rng().gen_range(10..99); + + let json = serde_json::to_string_pretty(&xdb).unwrap(); + let mut f1 = File::create("output.json").unwrap(); + f1.write(json.as_bytes()); + + /* let unique_id = rand::thread_rng().gen_range(10..99); if let XSomeList::TrackList(tracks) = &mut xdb.find_dataset(1).child { /*let mut item = (*tracks.last().unwrap()).clone(); @@ -46,7 +51,7 @@ fn main() { tracks.push(item);*/ let mut item = tracks.last_mut().unwrap(); item.args.first_mut().unwrap().val = String::from("Goy next door"); - } + } */ /*if let XSomeList::Playlists(playlists) = &mut xdb.find_dataset(3).child { let playlist = playlists.last_mut().unwrap(); diff --git a/src/serializer.rs b/src/serializer.rs index 74a4f29..0da8f06 100644 --- a/src/serializer.rs +++ b/src/serializer.rs @@ -3,8 +3,8 @@ use log::info; use crate::{objects::{ChunkHeader, ChunkType, PlaylistItem, StringEntry}, xobjects::{XArgument, XDatabase, XLetterJump, XPlArgument, XPlaylistIndexEntry, XSomeList}}; -fn string_to_ipod16(str: &String) -> Vec { - str.as_bytes().iter().map(|b| [*b, 0x0]).flatten().collect() +fn string_to_ipod16(str: &str) -> Vec { + str.encode_utf16().map(|f| [f as u8, (f >> 8) as u8]).flatten().collect() } fn x_args_to_bytes(args: &Vec) -> Vec {