js太长了,分成好几段发上来/* constant parameters */
var zip_WSIZE = 32768; // Sliding Window size
var zip_STORED_BLOCK = 0;
var zip_STATIC_TREES = 1;
var zip_DYN_TREES    = 2;/* for deflate */
var zip_DEFAULT_LEVEL = 6;
var zip_FULL_SEARCH = true;
var zip_INBUFSIZ = 32768; // Input buffer size
var zip_INBUF_EXTRA = 64; // Extra buffer
var zip_OUTBUFSIZ = 1024 * 8;
var zip_window_size = 2 * zip_WSIZE;
var zip_MIN_MATCH = 3;
var zip_MAX_MATCH = 258;
var zip_BITS = 16;
// for SMALL_MEM
var zip_LIT_BUFSIZE = 0x2000;
var zip_HASH_BITS = 13;
// for MEDIUM_MEM
// var zip_LIT_BUFSIZE = 0x4000;
// var zip_HASH_BITS = 14;
// for BIG_MEM
// var zip_LIT_BUFSIZE = 0x8000;
// var zip_HASH_BITS = 15;
if(zip_LIT_BUFSIZE > zip_INBUFSIZ)
    alert("error: zip_INBUFSIZ is too small");
if((zip_WSIZE<<1) > (1<<zip_BITS))
    alert("error: zip_WSIZE is too large");
if(zip_HASH_BITS > zip_BITS-1)
    alert("error: zip_HASH_BITS is too large");
if(zip_HASH_BITS < 8 || zip_MAX_MATCH != 258)
    alert("error: Code too clever");
var zip_DIST_BUFSIZE = zip_LIT_BUFSIZE;
var zip_HASH_SIZE = 1 << zip_HASH_BITS;
var zip_HASH_MASK = zip_HASH_SIZE - 1;
var zip_WMASK = zip_WSIZE - 1;
var zip_NIL = 0; // Tail of hash chains
var zip_TOO_FAR = 4096;
var zip_MIN_LOOKAHEAD = zip_MAX_MATCH + zip_MIN_MATCH + 1;
var zip_MAX_DIST = zip_WSIZE - zip_MIN_LOOKAHEAD;
var zip_SMALLEST = 1;
var zip_MAX_BITS = 15;
var zip_MAX_BL_BITS = 7;
var zip_LENGTH_CODES = 29;
var zip_LITERALS =256;
var zip_END_BLOCK = 256;
var zip_L_CODES = zip_LITERALS + 1 + zip_LENGTH_CODES;
var zip_D_CODES = 30;
var zip_BL_CODES = 19;
var zip_REP_3_6 = 16;
var zip_REPZ_3_10 = 17;
var zip_REPZ_11_138 = 18;
var zip_HEAP_SIZE = 2 * zip_L_CODES + 1;
var zip_H_SHIFT = parseInt((zip_HASH_BITS + zip_MIN_MATCH - 1) /
   zip_MIN_MATCH);/* variables */
var zip_free_queue;
var zip_qhead, zip_qtail;
var zip_initflag;
var zip_outbuf = null;
var zip_outcnt, zip_outoff;
var zip_complete;
var zip_window;
var zip_d_buf;
var zip_l_buf;
var zip_prev;
var zip_bi_buf;
var zip_bi_valid;
var zip_block_start;
var zip_ins_h;
var zip_hash_head;
var zip_prev_match;
var zip_match_available;
var zip_match_length;
var zip_prev_length;
var zip_strstart;
var zip_match_start;
var zip_eofile;
var zip_lookahead;
var zip_max_chain_length;
var zip_max_lazy_match;
var zip_compr_level;
var zip_good_match;
var zip_nice_match;
var zip_dyn_ltree;
var zip_dyn_dtree;
var zip_static_ltree;
var zip_static_dtree;
var zip_bl_tree;
var zip_l_desc;
var zip_d_desc;
var zip_bl_desc;
var zip_bl_count;
var zip_heap;
var zip_heap_len;
var zip_heap_max;
var zip_depth;
var zip_length_code;
var zip_dist_code;
var zip_base_length;
var zip_base_dist;
var zip_flag_buf;
var zip_last_lit;
var zip_last_dist;
var zip_last_flags;
var zip_flags;
var zip_flag_bit;
var zip_opt_len;
var zip_static_len;
var zip_deflate_data;
var zip_deflate_pos;/* constant tables */
var zip_extra_lbits = new Array(
    0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0);
var zip_extra_dbits = new Array(
    0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13);
var zip_extra_blbits = new Array(
    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7);
var zip_bl_order = new Array(
    16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15);
var zip_configuration_table = new Array(
new zip_DeflateConfiguration(0,    0,   0,    0),
new zip_DeflateConfiguration(4,    4,   8,    4),
new zip_DeflateConfiguration(4,    5,  16,    8),
new zip_DeflateConfiguration(4,    6,  32,   32),
new zip_DeflateConfiguration(4,    4,  16,   16),
new zip_DeflateConfiguration(8,   16,  32,   32),
new zip_DeflateConfiguration(8,   16, 128,  128),
new zip_DeflateConfiguration(8,   32, 128,  256),
new zip_DeflateConfiguration(32, 128, 258, 1024),
new zip_DeflateConfiguration(32, 258, 258, 4096));/* objects (deflate) */
function zip_DeflateCT() {
    this.fc = 0; // frequency count or bit string
    this.dl = 0; // father node in Huffman tree or length of bit string
}function zip_DeflateTreeDesc() {
    this.dyn_tree = null; // the dynamic tree
    this.static_tree = null; // corresponding static tree or NULL
    this.extra_bits = null; // extra bits for each code or NULL
    this.extra_base = 0; // base index for extra_bits
    this.elems = 0; // max number of elements in the tree
    this.max_length = 0; // max bit length for the codes
    this.max_code = 0; // largest code with non zero frequency
}/* Values for max_lazy_match, good_match and max_chain_length, depending on
 * the desired pack level (0..9). The values given below have been tuned to
 * exclude worst case performance for pathological files. Better values may be
 * found for specific files.
 */
function zip_DeflateConfiguration(a, b, c, d) {
    this.good_length = a; // reduce lazy search above this match length
    this.max_lazy = b;    // do not perform lazy search above this match length
    this.nice_length = c; // quit search above this match length
    this.max_chain = d;
}function zip_DeflateBuffer() {
    this.next = null;
    this.len = 0;
    this.ptr = new Array(zip_OUTBUFSIZ);
    this.off = 0;
}/* routines (deflate) */function zip_deflate_start(level) {
    var i;    if(!level)
level = zip_DEFAULT_LEVEL;
    else if(level < 1)
level = 1;
    else if(level > 9)
level = 9;    zip_compr_level = level;
    zip_initflag = false;
    zip_eofile = false;
    if(zip_outbuf != null)
return;    zip_free_queue = zip_qhead = zip_qtail = null;
    zip_outbuf = new Array(zip_OUTBUFSIZ);
    zip_window = new Array(zip_window_size);
    zip_d_buf = new Array(zip_DIST_BUFSIZE);
    zip_l_buf = new Array(zip_INBUFSIZ + zip_INBUF_EXTRA);
    zip_prev = new Array(1 << zip_BITS);
    zip_dyn_ltree = new Array(zip_HEAP_SIZE);
    for(i = 0; i < zip_HEAP_SIZE; i++)
zip_dyn_ltree[i] = new zip_DeflateCT();
    zip_dyn_dtree = new Array(2*zip_D_CODES+1);
    for(i = 0; i < 2*zip_D_CODES+1; i++)
zip_dyn_dtree[i] = new zip_DeflateCT();
    zip_static_ltree = new Array(zip_L_CODES+2);
    for(i = 0; i < zip_L_CODES+2; i++)
zip_static_ltree[i] = new zip_DeflateCT();
    zip_static_dtree = new Array(zip_D_CODES);
    for(i = 0; i < zip_D_CODES; i++)
zip_static_dtree[i] = new zip_DeflateCT();
    zip_bl_tree = new Array(2*zip_BL_CODES+1);
    for(i = 0; i < 2*zip_BL_CODES+1; i++)
zip_bl_tree[i] = new zip_DeflateCT();
    zip_l_desc = new zip_DeflateTreeDesc();
    zip_d_desc = new zip_DeflateTreeDesc();
    zip_bl_desc = new zip_DeflateTreeDesc();
    zip_bl_count = new Array(zip_MAX_BITS+1);
    zip_heap = new Array(2*zip_L_CODES+1);
    zip_depth = new Array(2*zip_L_CODES+1);
    zip_length_code = new Array(zip_MAX_MATCH-zip_MIN_MATCH+1);
    zip_dist_code = new Array(512);
    zip_base_length = new Array(zip_LENGTH_CODES);
    zip_base_dist = new Array(zip_D_CODES);
    zip_flag_buf = new Array(parseInt(zip_LIT_BUFSIZE / 8));
}function zip_deflate_end() {
    zip_free_queue = zip_qhead = zip_qtail = null;
    zip_outbuf = null;
    zip_window = null;
    zip_d_buf = null;
    zip_l_buf = null;
    zip_prev = null;
    zip_dyn_ltree = null;
    zip_dyn_dtree = null;
    zip_static_ltree = null;
    zip_static_dtree = null;
    zip_bl_tree = null;
    zip_l_desc = null;
    zip_d_desc = null;
    zip_bl_desc = null;
    zip_bl_count = null;
    zip_heap = null;
    zip_depth = null;
    zip_length_code = null;
    zip_dist_code = null;
    zip_base_length = null;
    zip_base_dist = null;
    zip_flag_buf = null;
}function zip_reuse_queue(p) {
    p.next = zip_free_queue;
    zip_free_queue = p;
}

解决方案 »

  1.   

    function zip_new_queue() {
        var p;    if(zip_free_queue != null)
        {
    p = zip_free_queue;
    zip_free_queue = zip_free_queue.next;
        }
        else
    p = new zip_DeflateBuffer();
        p.next = null;
        p.len = p.off = 0;    return p;
    }function zip_head1(i) {
        return zip_prev[zip_WSIZE + i];
    }function zip_head2(i, val) {
        return zip_prev[zip_WSIZE + i] = val;
    }/* put_byte is used for the compressed output, put_ubyte for the
     * uncompressed output. However unlzw() uses window for its
     * suffix table instead of its output buffer, so it does not use put_ubyte
     * (to be cleaned up).
     */
    function zip_put_byte(c) {
        zip_outbuf[zip_outoff + zip_outcnt++] = c;
        if(zip_outoff + zip_outcnt == zip_OUTBUFSIZ)
    zip_qoutbuf();
    }/* Output a 16 bit value, lsb first */
    function zip_put_short(w) {
        w &= 0xffff;
        if(zip_outoff + zip_outcnt < zip_OUTBUFSIZ - 2) {
    zip_outbuf[zip_outoff + zip_outcnt++] = (w & 0xff);
    zip_outbuf[zip_outoff + zip_outcnt++] = (w >>> 8);
        } else {
    zip_put_byte(w & 0xff);
    zip_put_byte(w >>> 8);
        }
    }/* ==========================================================================
     * Insert string s in the dictionary and set match_head to the previous head
     * of the hash chain (the most recent string with same hash key). Return
     * the previous length of the hash chain.
     * IN  assertion: all calls to to INSERT_STRING are made with consecutive
     *    input characters and the first MIN_MATCH bytes of s are valid
     *    (except for the last MIN_MATCH-1 bytes of the input file).
     */
    function zip_INSERT_STRING() {
        zip_ins_h = ((zip_ins_h << zip_H_SHIFT)
     ^ (zip_window[zip_strstart + zip_MIN_MATCH - 1] & 0xff))
    & zip_HASH_MASK;
        zip_hash_head = zip_head1(zip_ins_h);
        zip_prev[zip_strstart & zip_WMASK] = zip_hash_head;
        zip_head2(zip_ins_h, zip_strstart);
    }/* Send a code of the given tree. c and tree must not have side effects */
    function zip_SEND_CODE(c, tree) {
        zip_send_bits(tree[c].fc, tree[c].dl);
    }/* Mapping from a distance to a distance code. dist is the distance - 1 and
     * must not have side effects. dist_code[256] and dist_code[257] are never
     * used.
     */
    function zip_D_CODE(dist) {
        return (dist < 256 ? zip_dist_code[dist]
        : zip_dist_code[256 + (dist>>7)]) & 0xff;
    }/* ==========================================================================
     * Compares to subtrees, using the tree depth as tie breaker when
     * the subtrees have equal frequency. This minimizes the worst case length.
     */
    function zip_SMALLER(tree, n, m) {
        return tree[n].fc < tree[m].fc ||
          (tree[n].fc == tree[m].fc && zip_depth[n] <= zip_depth[m]);
    }/* ==========================================================================
     * read string data
     */
    function zip_read_buff(buff, offset, n) {
        var i;
        for(i = 0; i < n && zip_deflate_pos < zip_deflate_data.length; i++)
    buff[offset + i] =
        zip_deflate_data.charCodeAt(zip_deflate_pos++) & 0xff;
        return i;
    }/* ==========================================================================
     * Initialize the "longest match" routines for a new file
     */
    function zip_lm_init() {
        var j;    /* Initialize the hash table. */
        for(j = 0; j < zip_HASH_SIZE; j++)
    // zip_head2(j, zip_NIL);
    zip_prev[zip_WSIZE + j] = 0;
        /* prev will be initialized on the fly */    /* Set the default configuration parameters:
         */
        zip_max_lazy_match = zip_configuration_table[zip_compr_level].max_lazy;
        zip_good_match     = zip_configuration_table[zip_compr_level].good_length;
        if(!zip_FULL_SEARCH)
    zip_nice_match = zip_configuration_table[zip_compr_level].nice_length;
        zip_max_chain_length = zip_configuration_table[zip_compr_level].max_chain;    zip_strstart = 0;
        zip_block_start = 0;    zip_lookahead = zip_read_buff(zip_window, 0, 2 * zip_WSIZE);
        if(zip_lookahead <= 0) {
    zip_eofile = true;
    zip_lookahead = 0;
    return;
        }
        zip_eofile = false;
        /* Make sure that we always have enough lookahead. This is important
         * if input comes from a device such as a tty.
         */
        while(zip_lookahead < zip_MIN_LOOKAHEAD && !zip_eofile)
    zip_fill_window();    /* If lookahead < MIN_MATCH, ins_h is garbage, but this is     * not important since only literal bytes will be emitted.
         */
        zip_ins_h = 0;
        for(j = 0; j < zip_MIN_MATCH - 1; j++) {
    //      UPDATE_HASH(ins_h, window[j]);
    zip_ins_h = ((zip_ins_h << zip_H_SHIFT) ^ (zip_window[j] & 0xff)) & zip_HASH_MASK;
        }
    }/* ==========================================================================
     * Set match_start to the longest match starting at the given string and
     * return its length. Matches shorter or equal to prev_length are discarded,
     * in which case the result is equal to prev_length and match_start is
     * garbage.
     * IN assertions: cur_match is the head of the hash chain for the current
     *   string (strstart) and its distance is <= MAX_DIST, and prev_length >= 1
     */
    function zip_longest_match(cur_match) {
        var chain_length = zip_max_chain_length; // max hash chain length
        var scanp = zip_strstart; // current string
        var matchp; // matched string
        var len; // length of current match
        var best_len = zip_prev_length; // best match length so far    /* Stop when cur_match becomes <= limit. To simplify the code,
         * we prevent matches with the string of window index 0.
         */
        var limit = (zip_strstart > zip_MAX_DIST ? zip_strstart - zip_MAX_DIST : zip_NIL);    var strendp = zip_strstart + zip_MAX_MATCH;
        var scan_end1 = zip_window[scanp + best_len - 1];
        var scan_end  = zip_window[scanp + best_len];    /* Do not waste too much time if we already have a good match: */
        if(zip_prev_length >= zip_good_match)
    chain_length >>= 2;//  Assert(encoder->strstart <= window_size-MIN_LOOKAHEAD, "insufficient lookahead");    do {
    //    Assert(cur_match < encoder->strstart, "no future");
    matchp = cur_match; /* Skip to next match if the match length cannot increase
        * or if the match length is less than 2:
    */
    if(zip_window[matchp + best_len] != scan_end  ||
       zip_window[matchp + best_len - 1] != scan_end1 ||
       zip_window[matchp] != zip_window[scanp] ||
       zip_window[++matchp] != zip_window[scanp + 1]) {
        continue;
    } /* The check at best_len-1 can be removed because it will be made
             * again later. (This heuristic is not always a win.)
             * It is not necessary to compare scan[2] and match[2] since they
             * are always equal when the other bytes match, given that
             * the hash keys are equal and that HASH_BITS >= 8.
             */
    scanp += 2;
    matchp++; /* We check for insufficient lookahead only every 8th comparison;
             * the 256th check will be made at strstart+258.
             */
    do {
    } while(zip_window[++scanp] == zip_window[++matchp] &&
    zip_window[++scanp] == zip_window[++matchp] &&
    zip_window[++scanp] == zip_window[++matchp] &&
    zip_window[++scanp] == zip_window[++matchp] &&
    zip_window[++scanp] == zip_window[++matchp] &&
    zip_window[++scanp] == zip_window[++matchp] &&
    zip_window[++scanp] == zip_window[++matchp] &&
    zip_window[++scanp] == zip_window[++matchp] &&
    scanp < strendp);      len = zip_MAX_MATCH - (strendp - scanp);
          scanp = strendp - zip_MAX_MATCH;      if(len > best_len) {
      zip_match_start = cur_match;
      best_len = len;
      if(zip_FULL_SEARCH) {
          if(len >= zip_MAX_MATCH) break;
      } else {
          if(len >= zip_nice_match) break;
      }   scan_end1  = zip_window[scanp + best_len-1];
      scan_end   = zip_window[scanp + best_len];
          }
        } while((cur_match = zip_prev[cur_match & zip_WMASK]) > limit
        && --chain_length != 0);    return best_len;
    }
      

  2.   


    /* ==========================================================================
     * Fill the window when the lookahead becomes insufficient.
     * Updates strstart and lookahead, and sets eofile if end of input file.
     * IN assertion: lookahead < MIN_LOOKAHEAD && strstart + lookahead > 0
     * OUT assertions: at least one byte has been read, or eofile is set;
     *    file reads are performed for at least two bytes (required for the
     *    translate_eol option).
     */
    function zip_fill_window() {
        var n, m;    // Amount of free space at the end of the window.
        var more = zip_window_size - zip_lookahead - zip_strstart;    /* If the window is almost full and there is insufficient lookahead,
         * move the upper half to the lower one to make room in the upper half.
         */
        if(more == -1) {
    /* Very unlikely, but possible on 16 bit machine if strstart == 0
             * and lookahead == 1 (input done one byte at time)
             */
    more--;
        } else if(zip_strstart >= zip_WSIZE + zip_MAX_DIST) {
    /* By the IN assertion, the window is not empty so we can't confuse
             * more == 0 with more == 64K on a 16 bit machine.
             */
    // Assert(window_size == (ulg)2*WSIZE, "no sliding with BIG_MEM");// System.arraycopy(window, WSIZE, window, 0, WSIZE);
    for(n = 0; n < zip_WSIZE; n++)
        zip_window[n] = zip_window[n + zip_WSIZE];
          
    zip_match_start -= zip_WSIZE;
    zip_strstart    -= zip_WSIZE; /* we now have strstart >= MAX_DIST: */
    zip_block_start -= zip_WSIZE; for(n = 0; n < zip_HASH_SIZE; n++) {
        m = zip_head1(n);
        zip_head2(n, m >= zip_WSIZE ? m - zip_WSIZE : zip_NIL);
    }
    for(n = 0; n < zip_WSIZE; n++) {
        /* If n is not on any hash chain, prev[n] is garbage but
         * its value will never be used.
         */
        m = zip_prev[n];
        zip_prev[n] = (m >= zip_WSIZE ? m - zip_WSIZE : zip_NIL);
    }
    more += zip_WSIZE;
        }
        // At this point, more >= 2
        if(!zip_eofile) {
    n = zip_read_buff(zip_window, zip_strstart + zip_lookahead, more);
    if(n <= 0)
        zip_eofile = true;
    else
        zip_lookahead += n;
        }
    }/* ==========================================================================
     * Processes a new input file and return its compressed length. This
     * function does not perform lazy evaluationof matches and inserts
     * new strings in the dictionary only for unmatched strings or for short
     * matches. It is used only for the fast compression options.
     */
    function zip_deflate_fast() {
        while(zip_lookahead != 0 && zip_qhead == null) {
    var flush; // set if current block must be flushed /* Insert the string window[strstart .. strstart+2] in the
     * dictionary, and set hash_head to the head of the hash chain:
     */
    zip_INSERT_STRING(); /* Find the longest match, discarding those <= prev_length.
     * At this point we have always match_length < MIN_MATCH
     */
    if(zip_hash_head != zip_NIL &&
       zip_strstart - zip_hash_head <= zip_MAX_DIST) {
        /* To simplify the code, we prevent matches with the string
         * of window index 0 (in particular we have to avoid a match
         * of the string with itself at the start of the input file).
         */
        zip_match_length = zip_longest_match(zip_hash_head);
        /* longest_match() sets match_start */
        if(zip_match_length > zip_lookahead)
    zip_match_length = zip_lookahead;
    }
    if(zip_match_length >= zip_MIN_MATCH) {
    //     check_match(strstart, match_start, match_length);     flush = zip_ct_tally(zip_strstart - zip_match_start,
     zip_match_length - zip_MIN_MATCH);
        zip_lookahead -= zip_match_length;     /* Insert new strings in the hash table only if the match length
         * is not too large. This saves time but degrades compression.
         */
        if(zip_match_length <= zip_max_lazy_match) {
    zip_match_length--; // string at strstart already in hash table
    do {
        zip_strstart++;
        zip_INSERT_STRING();
        /* strstart never exceeds WSIZE-MAX_MATCH, so there are
         * always MIN_MATCH bytes ahead. If lookahead < MIN_MATCH
         * these bytes are garbage, but it does not matter since
         * the next lookahead bytes will be emitted as literals.
         */
    } while(--zip_match_length != 0);
    zip_strstart++;
        } else {
    zip_strstart += zip_match_length;
    zip_match_length = 0;
    zip_ins_h = zip_window[zip_strstart] & 0xff;
    // UPDATE_HASH(ins_h, window[strstart + 1]);
    zip_ins_h = ((zip_ins_h<<zip_H_SHIFT) ^ (zip_window[zip_strstart + 1] & 0xff)) & zip_HASH_MASK;//#if MIN_MATCH != 3
    // Call UPDATE_HASH() MIN_MATCH-3 more times
    //#endif     }
    } else {
        /* No match, output a literal byte */
        flush = zip_ct_tally(0, zip_window[zip_strstart] & 0xff);
        zip_lookahead--;
        zip_strstart++;
    }
    if(flush) {
        zip_flush_block(0);
        zip_block_start = zip_strstart;
    } /* Make sure that we always have enough lookahead, except
     * at the end of the input file. We need MAX_MATCH bytes
     * for the next match, plus MIN_MATCH bytes to insert the
     * string following the next match.
     */
    while(zip_lookahead < zip_MIN_LOOKAHEAD && !zip_eofile)
        zip_fill_window();
        }
    }
      

  3.   


    function zip_deflate_better() {
        /* Process the input block. */
        while(zip_lookahead != 0 && zip_qhead == null) {
    /* Insert the string window[strstart .. strstart+2] in the
     * dictionary, and set hash_head to the head of the hash chain:
     */
    zip_INSERT_STRING(); /* Find the longest match, discarding those <= prev_length.
     */
    zip_prev_length = zip_match_length;
    zip_prev_match = zip_match_start;
    zip_match_length = zip_MIN_MATCH - 1; if(zip_hash_head != zip_NIL &&
       zip_prev_length < zip_max_lazy_match &&
       zip_strstart - zip_hash_head <= zip_MAX_DIST) {
        /* To simplify the code, we prevent matches with the string
         * of window index 0 (in particular we have to avoid a match
         * of the string with itself at the start of the input file).
         */
        zip_match_length = zip_longest_match(zip_hash_head);
        /* longest_match() sets match_start */
        if(zip_match_length > zip_lookahead)
    zip_match_length = zip_lookahead;     /* Ignore a length 3 match if it is too distant: */
        if(zip_match_length == zip_MIN_MATCH &&
           zip_strstart - zip_match_start > zip_TOO_FAR) {
    /* If prev_match is also MIN_MATCH, match_start is garbage
     * but we will ignore the current match anyway.
     */
    zip_match_length--;
        }
    }
    /* If there was a match at the previous step and the current
     * match is not better, output the previous match:
     */
    if(zip_prev_length >= zip_MIN_MATCH &&
       zip_match_length <= zip_prev_length) {
        var flush; // set if current block must be flushed//     check_match(strstart - 1, prev_match, prev_length);
        flush = zip_ct_tally(zip_strstart - 1 - zip_prev_match,
     zip_prev_length - zip_MIN_MATCH);     /* Insert in hash table all strings up to the end of the match.
         * strstart-1 and strstart are already inserted.
         */
        zip_lookahead -= zip_prev_length - 1;
        zip_prev_length -= 2;
        do {
    zip_strstart++;
    zip_INSERT_STRING();
    /* strstart never exceeds WSIZE-MAX_MATCH, so there are
     * always MIN_MATCH bytes ahead. If lookahead < MIN_MATCH
     * these bytes are garbage, but it does not matter since the
     * next lookahead bytes will always be emitted as literals.
     */
        } while(--zip_prev_length != 0);
        zip_match_available = 0;
        zip_match_length = zip_MIN_MATCH - 1;
        zip_strstart++;
        if(flush) {
    zip_flush_block(0);
    zip_block_start = zip_strstart;
        }
    } else if(zip_match_available != 0) {
        /* If there was no match at the previous position, output a
         * single literal. If there was a match but the current match
         * is longer, truncate the previous match to a single literal.
         */
        if(zip_ct_tally(0, zip_window[zip_strstart - 1] & 0xff)) {
    zip_flush_block(0);
    zip_block_start = zip_strstart;
        }
        zip_strstart++;
        zip_lookahead--;
    } else {
        /* There is no previous match to compare with, wait for
         * the next step to decide.
         */
        zip_match_available = 1;
        zip_strstart++;
        zip_lookahead--;
    } /* Make sure that we always have enough lookahead, except
     * at the end of the input file. We need MAX_MATCH bytes
     * for the next match, plus MIN_MATCH bytes to insert the
     * string following the next match.
     */
    while(zip_lookahead < zip_MIN_LOOKAHEAD && !zip_eofile)
        zip_fill_window();
        }
    }function zip_init_deflate() {
        if(zip_eofile)
    return;
        zip_bi_buf = 0;
        zip_bi_valid = 0;
        zip_ct_init();
        zip_lm_init();    zip_qhead = null;
        zip_outcnt = 0;
        zip_outoff = 0;    if(zip_compr_level <= 3)
        {
    zip_prev_length = zip_MIN_MATCH - 1;
    zip_match_length = 0;
        }
        else
        {
    zip_match_length = zip_MIN_MATCH - 1;
    zip_match_available = 0;
        }    zip_complete = false;
    }
      

  4.   

    哦。我看出来了。楼主的是拿的一个JS的inflate算法,是ZIP压缩的一种。想必楼主是想用来加密解密一些敏感数据,顺便可以压缩。呵呵想说的是,PHP已经自带了inflate的加密和解密算法了,就是gzinflate()和gzdeflate()。楼主可以自己试试。呵呵
      

  5.   

    但是PHP自带的inflate压缩js没法解压出来