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