package LZMA; import java.io.IOException; import java.io.InputStream; class CRangeDecoder { static final int kNumTopBits = 24; static final int kTopValue = 16777216; static final int kTopValueMask = -16777216; static final int kNumBitModelTotalBits = 11; static final int kBitModelTotal = 2048; static final int kNumMoveBits = 5; InputStream inStream; int Range; int Code; byte[] buffer; int buffer_size; int buffer_ind; static final int kNumPosBitsMax = 4; static final int kNumPosStatesMax = 16; static final int kLenNumLowBits = 3; static final int kLenNumLowSymbols = 8; static final int kLenNumMidBits = 3; static final int kLenNumMidSymbols = 8; static final int kLenNumHighBits = 8; static final int kLenNumHighSymbols = 256; static final int LenChoice = 0; static final int LenChoice2 = 1; static final int LenLow = 2; static final int LenMid = 130; static final int LenHigh = 258; static final int kNumLenProbs = 514; CRangeDecoder(InputStream paramInputStream) throws IOException { buffer = new byte[16384]; inStream = paramInputStream; Code = 0; Range = -1; for (int i = 0; i < 5; i++) Code = (Code << 8 | Readbyte()); } int Readbyte() throws IOException { if (buffer_size == buffer_ind) { buffer_size = inStream.read(buffer); buffer_ind = 0; if (buffer_size < 1) throw new LzmaException("LZMA : Data Error"); } return buffer[(buffer_ind++)] & 0xFF; } int DecodeDirectBits(int paramInt) throws IOException { int i = 0; for (int j = paramInt; j > 0; j--) { Range >>>= 1; int k = Code - Range >>> 31; Code -= (Range & k - 1); i = i << 1 | 1 - k; if (Range >= 16777216) continue; Code = (Code << 8 | Readbyte()); Range <<= 8; } return i; } int BitDecode(int[] paramArrayOfInt, int paramInt) throws IOException { int i = (Range >>> 11) * paramArrayOfInt[paramInt]; if ((Code & 0xFFFFFFFF) < (i & 0xFFFFFFFF)) { Range = i; paramArrayOfInt[paramInt] += (2048 - paramArrayOfInt[paramInt] >>> 5); if ((Range & 0xFF000000) == 0) { Code = (Code << 8 | Readbyte()); Range <<= 8; } return 0; } Range -= i; Code -= i; paramArrayOfInt[paramInt] -= (paramArrayOfInt[paramInt] >>> 5); if ((Range & 0xFF000000) == 0) { Code = (Code << 8 | Readbyte()); Range <<= 8; } return 1; } int BitTreeDecode(int[] paramArrayOfInt, int paramInt1, int paramInt2) throws IOException { int i = 1; for (int j = paramInt2; j > 0; j--) { i = i + i + BitDecode(paramArrayOfInt, paramInt1 + i); } return i - (1 << paramInt2); } int ReverseBitTreeDecode(int[] paramArrayOfInt, int paramInt1, int paramInt2) throws IOException { int i = 1; int j = 0; for (int k = 0; k < paramInt2; k++) { int m = BitDecode(paramArrayOfInt, paramInt1 + i); i = i + i + m; j |= m << k; } return j; } byte LzmaLiteralDecode(int[] paramArrayOfInt, int paramInt) throws IOException { int i = 1; do i = i + i | BitDecode(paramArrayOfInt, paramInt + i); while (i < 256); return (byte) i; } byte LzmaLiteralDecodeMatch(int[] paramArrayOfInt, int paramInt, byte paramByte) throws IOException { int i = 1; do { int j = paramByte >> 7 & 0x1; paramByte = (byte) (paramByte << 1); int k = BitDecode(paramArrayOfInt, paramInt + (1 + j << 8) + i); i = i << 1 | k; if (j != k) { while (i < 256) { i = i + i | BitDecode(paramArrayOfInt, paramInt + i); } } } while (i < 256); return (byte) i; } int LzmaLenDecode(int[] paramArrayOfInt, int paramInt1, int paramInt2) throws IOException { if (BitDecode(paramArrayOfInt, paramInt1 + 0) == 0) { return BitTreeDecode(paramArrayOfInt, paramInt1 + 2 + (paramInt2 << 3), 3); } if (BitDecode(paramArrayOfInt, paramInt1 + 1) == 0) { return 8 + BitTreeDecode(paramArrayOfInt, paramInt1 + 130 + (paramInt2 << 3), 3); } return 16 + BitTreeDecode(paramArrayOfInt, paramInt1 + 258, 8); } }