⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cbzip2inputstream.java

📁 Use the links below to download a source distribution of Ant from one of our mirrors. It is good pra
💻 JAVA
📖 第 1 页 / 共 3 页
字号:
            } finally {                this.data = null;                this.in = null;            }        }    }    private int bsR(final int n) throws IOException {        int bsLiveShadow = this.bsLive;        int bsBuffShadow = this.bsBuff;        if (bsLiveShadow < n) {            final InputStream inShadow = this.in;            do {                int thech = inShadow.read();                if (thech < 0) {                    throw new IOException("unexpected end of stream");                }                bsBuffShadow = (bsBuffShadow << 8) | thech;                bsLiveShadow += 8;            } while (bsLiveShadow < n);            this.bsBuff = bsBuffShadow;        }        this.bsLive = bsLiveShadow - n;        return (bsBuffShadow >> (bsLiveShadow - n)) & ((1 << n) - 1);    }    private boolean bsGetBit() throws IOException {        int bsLiveShadow = this.bsLive;        int bsBuffShadow = this.bsBuff;        if (bsLiveShadow < 1) {            int thech = this.in.read();            if (thech < 0) {                throw new IOException("unexpected end of stream");            }            bsBuffShadow = (bsBuffShadow << 8) | thech;            bsLiveShadow += 8;            this.bsBuff = bsBuffShadow;        }        this.bsLive = bsLiveShadow - 1;        return ((bsBuffShadow >> (bsLiveShadow - 1)) & 1) != 0;    }    private char bsGetUByte() throws IOException {        return (char) bsR(8);    }    private int bsGetInt() throws IOException {        return (((((bsR(8) << 8) | bsR(8)) << 8) | bsR(8)) << 8) | bsR(8);    }    /**     * Called by createHuffmanDecodingTables() exclusively.     */    private static void hbCreateDecodeTables(final int[] limit,                                             final int[] base,                                             final int[] perm,                                             final char[] length,                                             final int minLen,                                             final int maxLen,                                             final int alphaSize) {        for (int i = minLen, pp = 0; i <= maxLen; i++) {            for (int j = 0; j < alphaSize; j++) {                if (length[j] == i) {                    perm[pp++] = j;                }            }        }        for (int i = MAX_CODE_LEN; --i > 0;) {            base[i] = 0;            limit[i] = 0;        }        for (int i = 0; i < alphaSize; i++) {            base[length[i] + 1]++;        }        for (int i = 1, b = base[0]; i < MAX_CODE_LEN; i++) {            b += base[i];            base[i] = b;        }        for (int i = minLen, vec = 0, b = base[i]; i <= maxLen; i++) {            final int nb = base[i + 1];            vec += nb - b;            b = nb;            limit[i] = vec - 1;            vec <<= 1;        }        for (int i = minLen + 1; i <= maxLen; i++) {            base[i] = ((limit[i - 1] + 1) << 1) - base[i];        }    }    private void recvDecodingTables() throws IOException {        final Data dataShadow     = this.data;        final boolean[] inUse     = dataShadow.inUse;        final byte[] pos          = dataShadow.recvDecodingTables_pos;        final byte[] selector     = dataShadow.selector;        final byte[] selectorMtf  = dataShadow.selectorMtf;        int inUse16 = 0;        /* Receive the mapping table */        for (int i = 0; i < 16; i++) {            if (bsGetBit()) {                inUse16 |= 1 << i;            }        }        for (int i = 256; --i >= 0;) {            inUse[i] = false;        }        for (int i = 0; i < 16; i++) {            if ((inUse16 & (1 << i)) != 0) {                final int i16 = i << 4;                for (int j = 0; j < 16; j++) {                    if (bsGetBit()) {                        inUse[i16 + j] = true;                    }                }            }        }        makeMaps();        final int alphaSize = this.nInUse + 2;        /* Now the selectors */        final int nGroups = bsR(3);        final int nSelectors = bsR(15);        for (int i = 0; i < nSelectors; i++) {            int j = 0;            while (bsGetBit()) {                j++;            }            selectorMtf[i] = (byte) j;        }        /* Undo the MTF values for the selectors. */        for (int v = nGroups; --v >= 0;) {            pos[v] = (byte) v;        }        for (int i = 0; i < nSelectors; i++) {            int v = selectorMtf[i] & 0xff;            final byte tmp = pos[v];            while (v > 0) {                // nearly all times v is zero, 4 in most other cases                pos[v] = pos[v - 1];                v--;            }            pos[0] = tmp;            selector[i] = tmp;        }        final char[][] len  = dataShadow.temp_charArray2d;        /* Now the coding tables */        for (int t = 0; t < nGroups; t++) {            int curr = bsR(5);            final char[] len_t = len[t];            for (int i = 0; i < alphaSize; i++) {                while (bsGetBit()) {                    curr += bsGetBit() ? -1 : 1;                }                len_t[i] = (char) curr;            }        }        // finally create the Huffman tables        createHuffmanDecodingTables(alphaSize, nGroups);    }    /**     * Called by recvDecodingTables() exclusively.     */    private void createHuffmanDecodingTables(final int alphaSize,                                             final int nGroups) {        final Data dataShadow = this.data;        final char[][] len  = dataShadow.temp_charArray2d;        final int[] minLens = dataShadow.minLens;        final int[][] limit = dataShadow.limit;        final int[][] base  = dataShadow.base;        final int[][] perm  = dataShadow.perm;        for (int t = 0; t < nGroups; t++) {            int minLen = 32;            int maxLen = 0;            final char[] len_t = len[t];            for (int i = alphaSize; --i >= 0;) {                final char lent = len_t[i];                if (lent > maxLen) {                    maxLen = lent;                }                if (lent < minLen) {                    minLen = lent;                }            }            hbCreateDecodeTables(limit[t], base[t], perm[t], len[t], minLen,                                 maxLen, alphaSize);            minLens[t] = minLen;        }    }    private void getAndMoveToFrontDecode() throws IOException {        this.origPtr = bsR(24);        recvDecodingTables();        final InputStream inShadow = this.in;        final Data dataShadow   = this.data;        final byte[] ll8        = dataShadow.ll8;        final int[] unzftab     = dataShadow.unzftab;        final byte[] selector   = dataShadow.selector;        final byte[] seqToUnseq = dataShadow.seqToUnseq;        final char[] yy         = dataShadow.getAndMoveToFrontDecode_yy;        final int[] minLens     = dataShadow.minLens;        final int[][] limit     = dataShadow.limit;        final int[][] base      = dataShadow.base;        final int[][] perm      = dataShadow.perm;        final int limitLast     = this.blockSize100k * 100000;        /*          Setting up the unzftab entries here is not strictly          necessary, but it does save having to do it later          in a separate pass, and so saves a block's worth of          cache misses.        */        for (int i = 256; --i >= 0;) {            yy[i] = (char) i;            unzftab[i] = 0;        }        int groupNo     = 0;        int groupPos    = G_SIZE - 1;        final int eob   = this.nInUse + 1;        int nextSym     = getAndMoveToFrontDecode0(0);        int bsBuffShadow      = this.bsBuff;        int bsLiveShadow      = this.bsLive;        int lastShadow        = -1;        int zt          = selector[groupNo] & 0xff;        int[] base_zt   = base[zt];        int[] limit_zt  = limit[zt];        int[] perm_zt   = perm[zt];        int minLens_zt  = minLens[zt];        while (nextSym != eob) {            if ((nextSym == RUNA) || (nextSym == RUNB)) {                int s = -1;                for (int n = 1; true; n <<= 1) {                    if (nextSym == RUNA) {                        s += n;                    } else if (nextSym == RUNB) {                        s += n << 1;                    } else {                        break;                    }                    if (groupPos == 0) {                        groupPos    = G_SIZE - 1;                        zt          = selector[++groupNo] & 0xff;                        base_zt     = base[zt];                        limit_zt    = limit[zt];                        perm_zt     = perm[zt];                        minLens_zt  = minLens[zt];                    } else {                        groupPos--;                    }                    int zn = minLens_zt;                    // Inlined:                    // int zvec = bsR(zn);                    while (bsLiveShadow < zn) {                        final int thech = inShadow.read();                        if (thech >= 0) {                            bsBuffShadow = (bsBuffShadow << 8) | thech;                            bsLiveShadow += 8;                            continue;                        } else {                            throw new IOException("unexpected end of stream");                        }                    }                    int zvec = (bsBuffShadow >> (bsLiveShadow - zn)) & ((1 << zn) - 1);                    bsLiveShadow -= zn;                    while (zvec > limit_zt[zn]) {                        zn++;                        while (bsLiveShadow < 1) {                            final int thech = inShadow.read();                            if (thech >= 0) {                                bsBuffShadow = (bsBuffShadow << 8) | thech;                                bsLiveShadow += 8;                                continue;                            } else {                                throw new IOException("unexpected end of stream");                            }                        }                        bsLiveShadow--;                        zvec = (zvec << 1) | ((bsBuffShadow >> bsLiveShadow) & 1);                    }                    nextSym = perm_zt[zvec - base_zt[zn]];                }                final byte ch = seqToUnseq[yy[0]];                unzftab[ch & 0xff] += s + 1;                while (s-- >= 0) {                    ll8[++lastShadow] = ch;                }                if (lastShadow >= limitLast) {                    throw new IOException("block overrun");                }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -