1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
use byteorder::{LittleEndian, ReadBytesExt, WriteBytesExt}; use std::io::{Read, Write, Error}; use crate::io::*; pub struct PBOHeader { pub filename: String, pub method: u32, pub original: u32, pub reserved: u32, pub timestamp: u32, pub size: u32, } impl PBOHeader { pub fn read<I: Read>(input: &mut I) -> Result<PBOHeader, Error> { Ok(PBOHeader { filename: input.read_cstring()?, method: input.read_u32::<LittleEndian>()?, original: input.read_u32::<LittleEndian>()?, reserved: input.read_u32::<LittleEndian>()?, timestamp: input.read_u32::<LittleEndian>()?, size: input.read_u32::<LittleEndian>()? }) } pub fn write<O: Write>(&self, output: &mut O) -> Result<(), Error> { output.write_cstring(&self.filename)?; output.write_u32::<LittleEndian>(self.method)?; output.write_u32::<LittleEndian>(self.original)?; output.write_u32::<LittleEndian>(self.reserved)?; output.write_u32::<LittleEndian>(self.timestamp)?; output.write_u32::<LittleEndian>(self.size)?; Ok(()) } } #[test] fn read() { use std::io::{Cursor}; let header = crate::header::PBOHeader::read(&mut Cursor::new(String::from("images\\mission.jpg ��*\\*W i"))).unwrap(); assert_eq!(header.filename, "images\\mission.jpg"); assert_eq!(header.size, 1546304959); assert_eq!(header.timestamp, 4022190063); }