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; }
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; }