test ReadStream with SGD decoding

This commit is contained in:
mykola2312 2023-08-29 23:26:24 +03:00
parent aa0990e472
commit 26c99c529d
2 changed files with 21 additions and 31 deletions

View file

@ -10,11 +10,10 @@ pub struct ReadStream<'a> {
}
impl<'a> ReadStream<'a> {
pub fn new(raw: &Raw, offset: usize) -> ReadStream {
ReadStream {
raw: raw,
rdr: Cursor::new(&raw.mem[offset..]),
}
pub fn new(raw: &Raw, start: usize) -> ReadStream {
let mut rdr = Cursor::new(&raw.mem[..]);
rdr.set_position(start as u64);
ReadStream { raw: raw, rdr: rdr }
}
pub fn offset(&self) -> usize {

View file

@ -1,6 +1,7 @@
use super::decoder::Decoder;
use super::fstring::FString;
use super::raw::Raw;
use super::stream::ReadStream;
use super::tag::Tag;
use anyhow::anyhow;
use anyhow::Result;
@ -23,37 +24,27 @@ impl World {
pub fn test(&self) -> Result<()> {
let sgd_start: usize = 0x4E;
let mut cur = sgd_start;
cur += Tag::decode(&self.data, sgd_start, 0)?.get_enc_size();
cur += 0x48;
let mut sgd = ReadStream::new(&self.data, sgd_start);
let _ = sgd.read::<Tag>(0)?;
sgd.skip(0x48);
let mut rdr = Cursor::new(&self.data.mem[..]);
rdr.set_position(cur as u64);
let N = rdr.read_u32::<LittleEndian>()?;
let mut names: Vec<FString> = Vec::new();
cur += 4;
for _ in 0..N {
let name = FString::decode(&self.data, cur, 0)?;
cur += name.get_enc_size();
names.push(name);
let n = sgd.read_u32()?;
dbg!(sgd.offset(), n);
let mut names: Vec<FString> = Vec::with_capacity(n as usize);
for _ in 0..n {
names.push(sgd.read::<FString>(0)?);
}
dbg!(names);
let unk1 = rdr.read_u32::<LittleEndian>()?;
cur += 4;
for _ in 0..N {
rdr.set_position(cur as u64);
let M = rdr.read_u32::<LittleEndian>()?;
cur += 4;
dbg!(M, cur);
let mut strings: Vec<FString> = Vec::new();
for _ in 0..M {
let str = FString::decode(&self.data, cur, 0)?;
cur += str.get_enc_size();
strings.push(str);
let unk1 = sgd.read_u32()?;
dbg!(unk1);
for _ in 0..n {
let m = sgd.read_u32()?;
let mut replics: Vec<FString> = Vec::with_capacity(m as usize);
for _ in 0..m {
replics.push(sgd.read::<FString>(0)?);
}
dbg!(strings);
dbg!(replics);
}
Ok(())