Deflate is a lossless data compression algorithm that uses a combination of the LZ77 algorithm and Huffman coding. It was originally defined by Phil Katz for version 2 of his PKZIP archiving tool and was later specified in RFC 1951.
The original algorithm as designed by Katz was patented as US patent 5051745 and assigned to PKWARE.[1] Deflate is widely thought to be free of any subsisting patents and was so at a time before the patent on LZW (which is used in the GIF file format) expired. This has led to its use in gzip compressed files and PNG image files in addition to the ZIP file format for which Katz originally designed it.
Contents |
A Deflate stream consists of a series of blocks. Each block is preceded by a 3-bit header:
1
: this is the last block in the stream.0
: there are more blocks to process after this one.00
: a stored/raw/literal section, between 0 and 65,535 bytes in length.01
: a static Huffman compressed block, using a pre-agreed Huffman tree.10
: a compressed block complete with the Huffman table supplied.11
: reserved, don't use.Most blocks will end up being encoded using method 10
, the dynamic Huffman encoding, which produces an optimised Huffman tree customised for each block of data individually. Instructions to generate the necessary Huffman tree immediately follow the block header.
Compression is achieved through two steps
Within compressed blocks, if a duplicate series of bytes is spotted (a repeated string), then a back-reference is inserted, linking to the previous location of that identical string instead. An encoded match to an earlier string consists of a length (3–258 bytes) and a distance (1–32,768 bytes). Relative back-references can be made across any number of blocks, as long as the distance appears within the last 32 kB of uncompressed data decoded (termed the sliding window).
The second compression stage consists of replacing commonly used symbols with shorter representations and less commonly used symbols with longer representations. The method used is Huffman coding which creates an unprefixed tree of non-overlapping intervals, where the length of each sequence is inversely proportional to the probability of that symbol needing to be encoded. The more likely a symbol has to be encoded, the shorter its bit-sequence will be.
A tree is created which contains space for 288 symbols:
A match length code will always be followed by a distance code. Based on the distance code read, further "extra" bits may be read in order to produce the final distance. The distance tree contains space for 32 symbols:
Note that for the match distance symbols 2–29, the number of extra bits can be calculated as .
During the compression stage, it is the encoder that chooses the amount of time spent looking for matching strings. The zlib/gzip reference implementation allows the user to select from a sliding scale of likely resulting compression-level vs. speed of encoding. Options range from -0
(do not attempt compression, just store uncompressed) to -9
representing the maximum capability of the reference implementation in zlib/gzip.
Other Deflate encoders have been produced, all of which will also produce a compatible bitstream capable of being decompressed by any existing Deflate decoder. Differing implementations will likely produce variations on the final encoded bit-stream produced. The focus with non-zlib versions of an encoder has normally been to produce a more efficiently compressed and smaller encoded stream.
Deflate64, specified by PKWare, is a proprietary variant of the Deflate procedure. The fundamental mechanisms remain the same. What has changed is the increase in dictionary size from 32kB to 64kB, an addition of 14 bits to the distance codes so that they may address a range of 64kB, and the length code has been extended by 16 bits so that it may define lengths of 3 to 65538 bytes.[2] This leads to Deflate64 having a slightly higher compression ratio and a slightly lower compression time than Deflate.[3] Several free and/or open source projects support Deflate64, such as 7-Zip, while others, such as zlib,[4] do not, as a result of the proprietary nature of the procedure and the very modest performance increase over Deflate.[5]
Implementations of Deflate are freely available in many languages. C programs typically use the zlib library (under the old BSD license without advertising clause). Programs written using the Borland dialects of Pascal can use paszlib, a C++ library is included as part of 7-Zip/AdvanceCOMP. Java includes support as part of the standard library (in java.util.zip). Microsoft .NET Framework 2.0 base class library supports it in the System.IO.Compression namespace.
zlib
encoder into pure Java and distributed under a BSD license. (Fully featured replacement for java.util.zip
).zlib
code into Pascal source code by Jacques Nomssi-Nzali.gzip
/ gunzip
with minimal memory requirement, also supporting on-the-fly data compression/decompression (no need to bufferize all input) and input/output to/from memory.00
) and fixed Huffman (type 01
) methods.AdvanceCOMP uses the higher compression ratio version of Deflate as implemented by 7-Zip to enable recompression of gzip, PNG, MNG and ZIP files with the possibility of achieving smaller file sizes than zlib is able to at maximum settings. An even more effective (but also more user-input-demanding and CPU intensive) Deflate encoder is employed inside Ken Silverman's KZIP and PNGOUT utilities.
193f:0001
) capable of compressing streams using Deflate at a rate of up to 3.0 Gbit/s (375 MB/s) for incoming uncompressed data. Accompanying the Linux kernel driver for the AHA361-PCIX is an 'ahagzip
' utility and customised 'mod_deflate_aha
' capable of using the hardware compression from Apache. The hardware is based on a Xilinx Virtex FPGA and four custom AHA3601 ASICs. The AHA361/AHA362 boards are limited to only handling static Huffman blocks and require software to be modified to add support—the cards were not able to support the full Deflate specification meaning they could only reliably decode their own output (a stream that did not contain any dynamic Huffman type 2 blocks).17b4:0011
) or PCI-X cards featuring between one and six compression engines with claimed processing speeds of up to 3.6 Gbit/s (450 MB/s). A version of the cards are available with the separate brand WebEnhance specifically designed for web-serving use rather than SAN or backup use; a PCIe revision, the MX4E is also produced.PCI-ID: 193f:0363
/193f:0364
) with a new hardware AHA3610 encoder chip. The new chip was designed to be capable of a sustained 2.5Gbit/s. Using two of these chips, the AHA363-PCIe board can process Deflate at a rate of up to 5.0 Gbit/s (625 MB/s) using the two channels (two compression and two decompression). The AHA364-PCIe variant is an encode-only version of the card designed for out-going load balancers and instead has multiple register sets to allow 32 independent virtual compression channels feeding two physical compression engines. Linux, Microsoft Windows, and OpenSolaris kernel device drivers are available for both of the new cards, along with a modified zlib system library so that dynamically linked applications can automatically use the hardware support without internal modification. The AHA367-PCIe board (PCI-ID: 193f:0367
) is similar to the AHA363-PCIe but uses four AHA3610 chips for a sustained compression rate of 10 Gbit/s (1250 MB/s). Unlike the AHA362-PCIX, the decompression engines on the AHA363-PCIe and AHA367-PCIe boards are fully deflate compliant.Inflate is the decoding process that takes a Deflate bit stream for decompression and correctly produces the original full-size data or file.
The normal intent with an alternative Inflate implementation is highly optimised decoding speed, or extremely predictable RAM usage for micro-controller embedded systems.
PCDEZIP
, Bob Flanders and Michael Holmes, published in PC Magazine 1994–01–11.appnote.txt
, .ZIP File Format Specification; Section 10, X. Deflating - Method 8.
|