Crate zip_parser

source ·
Expand description

Zip file format parser implemented by rust, supports stream parsing, no_std environment.

The Parser will search central directory at the end of zip file if Seek is available. Also, It supports sequence read parsing when Seek is not available. All types in std env implemented std::io::Read automatically implement Read, and so is the trait Seek.

stream parsing

use zip_parser as zip;
use zip::prelude::*;

#[cfg(feature = "std")]
fn parse<S: zip::Read + zip::Seek>(parser: Parser<S>) {
    for (i, mut file) in parser.enumerate() {
        println!("{}: {}({} Bytes)", i, unsafe { file.file_name() }, file.file_size());
        let mut buf = Vec::new();
        buf.resize(file.file_size() as usize, 0);
        if let Ok(n) = file.read(&mut buf) {
            println!("Data: {:02X?}", &buf[..n]);
        } else {
            println!("read failed");
        }
        println!();
    }
}

#[cfg(feature = "std")]
fn stdin_parsing() {
    println!("*** get stream from stdin ***");
    parse(Parser::new(std::io::stdin().lock()))
}

You just need to pass a stream which implements Read into the Parser::new(), then you can iterate over it. For more detail, see example stream_parsing.

Example

Stream_parsing

  1. From stdin
    cat test.zip | cargo run --features="std" --example stream_parsing
    
    or even you can cat multiple zip files:
    cat test.zip test.zip | cargo run --features="std" --example stream_parsing
    
  2. From file
    cargo run --features="std" --example stream_parsing -- test.zip
    

Passive parsing

In example [stream_parsing], there is a case for passive parsing: read data from a file and PassiveParser::feed_data to the parser.

Modules

Structs

Enums

Constants

Traits