impl Decoder
This commit is contained in:
parent
22fee005cd
commit
f1ee4a3d29
5 changed files with 38 additions and 1 deletions
|
|
@ -1,2 +1,3 @@
|
||||||
mod raw;
|
mod raw;
|
||||||
|
mod decoder;
|
||||||
pub mod save;
|
pub mod save;
|
||||||
25
src/fot/decoder.rs
Normal file
25
src/fot/decoder.rs
Normal file
|
|
@ -0,0 +1,25 @@
|
||||||
|
use std::str;
|
||||||
|
use anyhow::anyhow;
|
||||||
|
use anyhow::Result;
|
||||||
|
use crate::fot::raw::Raw;
|
||||||
|
|
||||||
|
pub trait Decoder: Sized {
|
||||||
|
fn decode(raw: &Raw, offset: usize, size: usize) -> Result<Self>;
|
||||||
|
fn encode(&self) -> Raw;
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Decoder for String {
|
||||||
|
fn decode(raw: &Raw, offset: usize, size: usize) -> Result<Self> {
|
||||||
|
let str = &raw.mem[offset..];
|
||||||
|
match str.iter().position(|&c| c == 0) {
|
||||||
|
Some(pos) => Ok(str::from_utf8(&str[..pos])?.to_string()),
|
||||||
|
None => Ok(str::from_utf8(&raw.mem[offset..offset+size])?.to_string())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn encode(&self) -> Raw {
|
||||||
|
let mut str = self.clone().into_bytes();
|
||||||
|
str.push(0);
|
||||||
|
Raw { offset: 0, size: str.len(), mem: str}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -7,6 +7,7 @@ use std::path::Path;
|
||||||
use memmem::{Searcher, TwoWaySearcher};
|
use memmem::{Searcher, TwoWaySearcher};
|
||||||
use anyhow::Result;
|
use anyhow::Result;
|
||||||
|
|
||||||
|
#[derive(Debug)]
|
||||||
pub struct Raw {
|
pub struct Raw {
|
||||||
pub offset: usize,
|
pub offset: usize,
|
||||||
pub size: usize,
|
pub size: usize,
|
||||||
|
|
|
||||||
|
|
@ -7,7 +7,9 @@ use anyhow::anyhow;
|
||||||
use anyhow::Result;
|
use anyhow::Result;
|
||||||
use inflate::inflate_bytes_zlib;
|
use inflate::inflate_bytes_zlib;
|
||||||
use deflate::deflate_bytes_zlib;
|
use deflate::deflate_bytes_zlib;
|
||||||
|
use crate::fot::decoder::Decoder;
|
||||||
use crate::fot::raw::Raw;
|
use crate::fot::raw::Raw;
|
||||||
|
use crate::fot::decoder;
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
pub struct World {
|
pub struct World {
|
||||||
|
|
@ -98,4 +100,11 @@ impl Save {
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn test(&self) -> Result<()> {
|
||||||
|
let a = "hello".to_string().encode();
|
||||||
|
dbg!(a);
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -18,5 +18,6 @@ fn main() {
|
||||||
println!("World {:x} size {}", w.offset, w.size);
|
println!("World {:x} size {}", w.offset, w.size);
|
||||||
}
|
}
|
||||||
|
|
||||||
save.save(Path::new("out.sav")).expect("failed to save");
|
//save.save(Path::new("out.sav")).expect("failed to save");
|
||||||
|
save.test().expect("test");
|
||||||
}
|
}
|
||||||
Loading…
Add table
Reference in a new issue