コード例 #1
0
ファイル: Inflater.cs プロジェクト: huaminglee/myyyyshop
 public Inflater(bool noHeader)
 {
     this.noHeader = noHeader;
     this.adler = new Adler32();
     this.input = new StreamManipulator();
     this.outputWindow = new OutputWindow();
     this.mode = noHeader ? 2 : 0;
 }
コード例 #2
0
ファイル: OutputWindow.cs プロジェクト: huaminglee/myyyyshop
 public int CopyStored(StreamManipulator input, int length)
 {
     int num;
     length = Math.Min(Math.Min(length, 0x8000 - this.windowFilled), input.AvailableBytes);
     int num2 = 0x8000 - this.windowEnd;
     if (length > num2)
     {
         num = input.CopyBytes(this.window, this.windowEnd, num2);
         if (num == num2)
         {
             num += input.CopyBytes(this.window, 0, length - num2);
         }
     }
     else
     {
         num = input.CopyBytes(this.window, this.windowEnd, length);
     }
     this.windowEnd = (this.windowEnd + num) & 0x7fff;
     this.windowFilled += num;
     return num;
 }
コード例 #3
0
 public int GetSymbol(StreamManipulator input)
 {
     int num2;
     int availableBits;
     int index = input.PeekBits(9);
     if (index >= 0)
     {
         num2 = this.tree[index];
         if (num2 >= 0)
         {
             input.DropBits(num2 & 15);
             return (num2 >> 4);
         }
         int num3 = -(num2 >> 4);
         int bitCount = num2 & 15;
         index = input.PeekBits(bitCount);
         if (index >= 0)
         {
             num2 = this.tree[num3 | (index >> 9)];
             input.DropBits(num2 & 15);
             return (num2 >> 4);
         }
         availableBits = input.AvailableBits;
         index = input.PeekBits(availableBits);
         num2 = this.tree[num3 | (index >> 9)];
         if ((num2 & 15) <= availableBits)
         {
             input.DropBits(num2 & 15);
             return (num2 >> 4);
         }
         return -1;
     }
     availableBits = input.AvailableBits;
     index = input.PeekBits(availableBits);
     num2 = this.tree[index];
     if ((num2 >= 0) && ((num2 & 15) <= availableBits))
     {
         input.DropBits(num2 & 15);
         return (num2 >> 4);
     }
     return -1;
 }
コード例 #4
0
        public bool Decode(StreamManipulator input)
        {
            int num2;
            int num3;
            bool flag2;
            goto Label_034E;
        Label_007E:
            this.dnum = input.PeekBits(5);
            if (this.dnum < 0)
            {
                return false;
            }
            this.dnum++;
            input.DropBits(5);
            this.num = this.lnum + this.dnum;
            this.litdistLens = new byte[this.num];
            this.mode = 2;
        Label_00E9:
            this.blnum = input.PeekBits(4);
            if (this.blnum < 0)
            {
                return false;
            }
            this.blnum += 4;
            input.DropBits(4);
            this.blLens = new byte[0x13];
            this.ptr = 0;
            this.mode = 3;
        Label_0191:
            while (this.ptr < this.blnum)
            {
                int num = input.PeekBits(3);
                if (num < 0)
                {
                    return false;
                }
                input.DropBits(3);
                this.blLens[BL_ORDER[this.ptr]] = (byte) num;
                this.ptr++;
            }
            this.blTree = new InflaterHuffmanTree(this.blLens);
            this.blLens = null;
            this.ptr = 0;
            this.mode = 4;
        Label_0219:
            while (((num2 = this.blTree.GetSymbol(input)) & -16) == 0)
            {
                this.litdistLens[this.ptr++] = this.lastLen = (byte) num2;
                if (this.ptr == this.num)
                {
                    return true;
                }
            }
            if (num2 < 0)
            {
                return false;
            }
            if (num2 >= 0x11)
            {
                this.lastLen = 0;
            }
            else if (this.ptr == 0)
            {
                throw new SharpZipBaseException();
            }
            this.repSymbol = num2 - 0x10;
            this.mode = 5;
        Label_028E:
            num3 = repBits[this.repSymbol];
            int num4 = input.PeekBits(num3);
            if (num4 < 0)
            {
                return false;
            }
            input.DropBits(num3);
            num4 += repMin[this.repSymbol];
            if ((this.ptr + num4) > this.num)
            {
                throw new SharpZipBaseException();
            }
            while (num4-- > 0)
            {
                this.litdistLens[this.ptr++] = this.lastLen;
            }
            if (this.ptr == this.num)
            {
                return true;
            }
            this.mode = 4;
        Label_034E:
            flag2 = true;
            switch (this.mode)
            {
                case 0:
                    this.lnum = input.PeekBits(5);
                    if (this.lnum >= 0)
                    {
                        this.lnum += 0x101;
                        input.DropBits(5);
                        this.mode = 1;
                        goto Label_007E;
                    }
                    return false;

                case 1:
                    goto Label_007E;

                case 2:
                    goto Label_00E9;

                case 3:
                    goto Label_0191;

                case 4:
                    goto Label_0219;

                case 5:
                    goto Label_028E;
            }
            goto Label_034E;
        }