Annotation of coherent/g/usr/bin/gzip/algorithm.doc, revision 1.1

1.1     ! root        1: 1. Algorithm
        !             2: 
        !             3: The deflation algorithm used by zip and gzip is a variation of LZ77
        !             4: (Lempel-Ziv 1977, see reference below). It finds duplicated strings in
        !             5: the input data.  The second occurrence of a string is replaced by a
        !             6: pointer to the previous string, in the form of a pair (distance,
        !             7: length).  Distances are limited to 32K bytes, and lengths are limited
        !             8: to 258 bytes. When a string does not occur anywhere in the previous
        !             9: 32K bytes, it is emitted as a sequence of literal bytes.  (In this
        !            10: description, 'string' must be taken as an arbitrary sequence of bytes,
        !            11: and is not restricted to printable characters.)
        !            12: 
        !            13: Literals or match lengths are compressed with one Huffman tree, and
        !            14: match distances are compressed with another tree. The trees are stored
        !            15: in a compact form at the start of each block. The blocks can have any
        !            16: size (except that the compressed data for one block must fit in
        !            17: available memory). A block is terminated when zip determines that it
        !            18: would be useful to start another block with fresh trees. (This is
        !            19: somewhat similar to compress.)
        !            20: 
        !            21: Duplicated strings are found using a hash table. All input strings of
        !            22: length 3 are inserted in the hash table. A hash index is computed for
        !            23: the next 3 bytes. If the hash chain for this index is not empty, all
        !            24: strings in the chain are compared with the current input string, and
        !            25: the longest match is selected.
        !            26: 
        !            27: The hash chains are searched starting with the most recent strings, to
        !            28: favor small distances and thus take advantage of the Huffman encoding.
        !            29: The hash chains are singly linked. There are no deletions from the
        !            30: hash chains, the algorithm simply discards matches that are too old.
        !            31: 
        !            32: To avoid a worst-case situation, very long hash chains are arbitrarily
        !            33: truncated at a certain length, determined by a runtime option (zip -1
        !            34: to -9). So zip does not always find the longest possible match but
        !            35: generally finds a match which is long enough.
        !            36: 
        !            37: zip also defers the selection of matches with a lazy evaluation
        !            38: mechanism. After a match of length N has been found, zip searches for a
        !            39: longer match at the next input byte. If a longer match is found, the
        !            40: previous match is truncated to a length of one (thus producing a single
        !            41: literal byte) and the longer match is emitted afterwards.  Otherwise,
        !            42: the original match is kept, and the next match search is attempted only
        !            43: N steps later.
        !            44: 
        !            45: The lazy match evaluation is also subject to a runtime parameter. If
        !            46: the current match is long enough, zip reduces the search for a longer
        !            47: match, thus speeding up the whole process. If compression ratio is more
        !            48: important than speed, zip attempts a complete second search even if
        !            49: the first match is already long enough.
        !            50: 
        !            51: 
        !            52: 2. gzip file format
        !            53: 
        !            54: The pkzip format imposes a lot of overhead in various headers, which
        !            55: are useful for an archiver but not necessary when only one file is
        !            56: compressed. gzip uses a much simpler structure. Numbers are in little
        !            57: endian format, and bit 0 is the least significant bit.
        !            58: A gzip file is a sequence of compressed members. Each member has the
        !            59: following structure:
        !            60: 
        !            61: 2 bytes  magic header  0x1f, 0x8b (\037 \213)  
        !            62: 1 byte   compression method (0..7 reserved, 8 = deflate)
        !            63: 1 byte   flags
        !            64:             bit 0 set: file probably ascii text
        !            65:             bit 1 set: continuation of multi-part gzip file
        !            66:             bit 2 set: extra field present
        !            67:             bit 3 set: original file name present
        !            68:             bit 4 set: file comment present
        !            69:             bit 5 set: file is encrypted
        !            70:             bit 6,7:   reserved
        !            71: 4 bytes  file modification time in Unix format
        !            72: 1 byte   extra flags (depend on compression method)
        !            73: 1 byte   operating system on which compression took place
        !            74: 
        !            75: 2 bytes  optional part number (second part=1)
        !            76: 2 bytes  optional extra field length
        !            77: ? bytes  optional extra field
        !            78: ? bytes  optional original file name, zero terminated
        !            79: ? bytes  optional file comment, zero terminated
        !            80: 12 bytes optional encryption header
        !            81: ? bytes  compressed data
        !            82: 4 bytes  crc32
        !            83: 4 bytes  uncompressed input size modulo 2^32
        !            84: 
        !            85: The format was designed to allow single pass compression without any
        !            86: backwards seek, and without a priori knowledge of the uncompressed
        !            87: input size or the available size on the output media. If input does
        !            88: not come from a regular disk file, the file modification time is set
        !            89: to the time at which compression started.
        !            90: 
        !            91: The time stamp is useful mainly when one gzip file is transferred over
        !            92: a network. In this case it would not help to keep ownership
        !            93: attributes. In the local case, the ownership attributes are preserved
        !            94: by gzip when compressing/decompressing the file. A time stamp of zero
        !            95: is ignored.
        !            96: 
        !            97: Bit 0 in the flags is only an optional indication, which can be set by
        !            98: a small lookahead in the input data. In case of doubt, the flag is
        !            99: cleared indicating binary data. For systems which have different
        !           100: file formats for ascii text and binary data, the decompressor can
        !           101: use the flag to choose the appropriate format.
        !           102: 
        !           103: It must be possible to detect the end of the compressed data with any
        !           104: compression format, regardless of the actual size of the compressed
        !           105: data. If the compressed data cannot fit in one file (in particular for
        !           106: diskettes), each part starts with a header as described above, but
        !           107: only the last part has the crc32 and uncompressed size. A decompressor
        !           108: may prompt for additional data for multipart compressed files. It is
        !           109: desirable but not mandatory that multiple parts be extractable
        !           110: independently so that partial data can be recovered if one of the
        !           111: parts is damaged. This is possible only if no compression state is
        !           112: kept from one part to the other. The compression-type dependent flags
        !           113: can indicate this.
        !           114: 
        !           115: If the file being compressed is on a file system with case insensitive
        !           116: names, the original name field must be forced to lower case. There is
        !           117: no original file name if the data was compressed from standard input.
        !           118: 
        !           119: On operating systems which support multiple extensions, and on
        !           120: original files without extension, the extension ".z" is added to the
        !           121: original file name (foo.c => foo.c.z). Otherwise the string "z" (or
        !           122: "-z" for VMS) is added to the original extension (foo.c => foo.cz or
        !           123: foo.c-z). The original name or extension is truncated if necessary,
        !           124: but in this case the original name is always saved in the compressed
        !           125: file (foo.doc => foo.doz).
        !           126: 
        !           127: Compression is always performed, even if the compressed file is
        !           128: slightly larger than the original. The worst case expansion is
        !           129: a few bytes for the gzip file header, plus 5 bytes every 32K block,
        !           130: or an expansion ratio of 0.015% for large files.
        !           131: 
        !           132: The encryption is that of zip 1.9. For the encryption check, the
        !           133: last byte of the decoded encryption header must be zero. The time
        !           134: stamp of an encrypted file might be set to zero to avoid giving a clue
        !           135: about the construction of the random header.
        !           136: 
        !           137: Jean-loup Gailly
        !           138: [email protected]
        !           139: 
        !           140: References:
        !           141: 
        !           142: [LZ77] Ziv J., Lempel A., "A Universal Algorithm for Sequential Data
        !           143: Compression", IEEE Transactions on Information Theory", Vol. 23, No. 3,
        !           144: pp. 337-343.
        !           145: 
        !           146: APPNOTE.TXT documentation file in PKZIP 1.93a. It is available by
        !           147: ftp in ux1.cso.uiuc.edu:/pc/exec-pc/pkz193a.exe [128.174.5.59]
        !           148: Use "unzip pkz193a.exe APPNOTE.TXT" to extract.

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.