示例#1
0
 public Inflater(bool noHeader)
 {
     this.noHeader = noHeader;
     adler = new Adler32();
     input = new StreamManipulator();
     outputWindow = new OutputWindow();
     mode = noHeader ? 2 : 0;
 }
示例#2
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;
 }
示例#3
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;
 }
示例#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[BlOrder[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;
        }