8 releases (stable)

new 1.2.1 Jul 5, 2025
1.2.0 Jul 3, 2025
1.1.0 Jun 28, 2025
0.3.0 Jun 22, 2025
0.1.8 Feb 28, 2025

#383 in Compression

Download history 9/week @ 2025-04-15 1/week @ 2025-04-22 12/week @ 2025-05-06 8/week @ 2025-05-13 128/week @ 2025-06-17 643/week @ 2025-06-24 915/week @ 2025-07-01

1,686 downloads per month
Used in sevenz-rust2

CC0 license

165KB
4K SLoC

PPMd in native Rust

Crate Documentation

PPMd compression / decompression. It's a port of the PPMd C-code from 7-Zip to Rust.

The following variants are provided:

  • The PPMd7 (PPMdH) as used by the 7z archive format
  • The PPMd8 (PPMdI rev.1) as used by the zip archive format

Notice

There are two ways to properly bound the uncompressed data:

  1. Save the uncompressed size along the compressed data and use std::io::Read::read_exact() to read the data (this is what is used in the 7z archive format).
  2. Encode an end marker by calling finish(true) on the encoder when finishing the encoder process. You can then use std::io::Read::read_to_end() to read the data. You are of course free to also use the std::io::Read::read_exact() if you have stored the uncompressed data size (this is what is used in the zip archive format).

Failing to do so will result in garbage symbols at the end of the actual data.

Acknowledgement

This port is based on the 7zip version of PPMd by Igor Pavlov, which in turn was based on the PPMd var.H (2001) / PPMd var.I (2002) code by Dmitry Shkarin. The carryless range coder of PPMd8 was originally written by Dmitry Subbotin (1999).

License

The code in this crate is in the public domain as the original code by their authors.

No runtime deps

Features