Exemple #1
0
 public Inflater(bool noHeader)
 {
     this.noHeader = noHeader;
     adler = new Adler32();
     input = new StreamManipulator();
     outputWindow = new OutputWindow();
     mode = noHeader ? 2 : 0;
 }
 public int GetSymbol(StreamManipulator input)
 {
     int num2;
     int index = input.PeekBits(9);
     if (index >= 0)
     {
         num2 = 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 = tree[num3 | (index >> 9)];
             input.DropBits(num2 & 15);
             return (num2 >> 4);
         }
         int num5 = input.AvailableBits;
         index = input.PeekBits(num5);
         num2 = tree[num3 | (index >> 9)];
         if ((num2 & 15) <= num5)
         {
             input.DropBits(num2 & 15);
             return (num2 >> 4);
         }
         return -1;
     }
     int availableBits = input.AvailableBits;
     index = input.PeekBits(availableBits);
     num2 = tree[index];
     if ((num2 >= 0) && ((num2 & 15) <= availableBits))
     {
         input.DropBits(num2 & 15);
         return (num2 >> 4);
     }
     return -1;
 }
Exemple #3
0
 public int CopyStored(StreamManipulator input, int length)
 {
     int num;
     length = Math.Min(Math.Min(length, 0x8000 - windowFilled), input.AvailableBytes);
     int num2 = 0x8000 - windowEnd;
     if (length > num2)
     {
         num = input.CopyBytes(window, windowEnd, num2);
         if (num == num2)
         {
             num += input.CopyBytes(window, 0, length - num2);
         }
     }
     else
     {
         num = input.CopyBytes(window, windowEnd, length);
     }
     windowEnd = (windowEnd + num) & 0x7fff;
     windowFilled += num;
     return num;
 }
Exemple #4
0
        public bool Decode(StreamManipulator input)
        {
            int num2;
            int num3;
            Label_0000:
            switch (this.mode)
            {
                case 0:
                    this.lnum = input.PeekBits(REPS);
                    if (this.lnum >= 0)
                    {
                        this.lnum += 0x101;
                        input.DropBits(REPS);
                        this.mode = 1;
                        break;
                    }
                    return false;

                case 1:
                    break;

                case 2:
                    goto Label_00B9;

                case 3:
                    goto Label_013B;

                case LENS:
                    goto Label_01A8;

                case REPS:
                    goto Label_01EE;

                default:
                    goto Label_0000;
            }
            dnum = input.PeekBits(REPS);
            if (dnum < 0)
            {
                return false;
            }
            dnum++;
            input.DropBits(REPS);
            this.num = lnum + dnum;
            litdistLens = new byte[this.num];
            mode = 2;
            Label_00B9:
            this.blnum = input.PeekBits(4);
            if (this.blnum < 0)
            {
                return false;
            }
            blnum += LENS;
            input.DropBits(LENS);
            blLens = new byte[0x13];
            this.ptr = 0;
            this.mode = 3;
            Label_013B:
            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 = LENS;
            Label_01A8:
            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 (ptr == 0)
            {
                throw new SharpZipBaseException();
            }
            repSymbol = num2 - 0x10;
            mode = REPS;
            Label_01EE:
            num3 = repBits[repSymbol];
            int num4 = input.PeekBits(num3);
            if (num4 < 0)
            {
                return false;
            }
            input.DropBits(num3);
            num4 += repMin[repSymbol];
            if ((ptr + num4) > this.num)
            {
                throw new SharpZipBaseException();
            }
            while (num4-- > 0)
            {
                litdistLens[ptr++] = lastLen;
            }
            if (this.ptr == this.num)
            {
                return true;
            }
            this.mode = LENS;
            goto Label_0000;
        }