⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 unpack20.java

📁 这是架包java-unrar-0.2.jar的源码
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
//				else if (bitField < dec.getDecodeLen()[11])
//					bits = 11;
//				else
//					bits = 12;
//			} else {
//				if (bitField < dec.getDecodeLen()[14]) {
//					if (bitField < dec.getDecodeLen()[13]) {
//						bits = 13;
//					} else {
//						bits = 14;
//					}
//				} else {
//					bits = 15;
//				}
//			}
//		}
//		addbits(bits);
//		int N = dec.getDecodePos()[bits]
//				+ (((int) bitField - dec.getDecodeLen()[bits - 1]) >>> (16 - bits));
//		if (N >= dec.getMaxNum()) {
//			N = 0;
//		}
//		return (dec.getDecodeNum()[N]);
        int[] decodeLen = dec.getDecodeLen();
        if (bitField < decodeLen[8]) {
			if (bitField < decodeLen[4]) {
				if (bitField < decodeLen[2]) {
					if (bitField < decodeLen[1]) {
						bits = 1;
					} else {
						bits = 2;
					}
				} else {
					if (bitField < decodeLen[3]) {
						bits = 3;
					} else {
						bits = 4;
					}
				}
			} else {
				if (bitField < decodeLen[6]) {
					if (bitField < decodeLen[5])
						bits = 5;
					else
						bits = 6;
				} else {
					if (bitField < decodeLen[7]) {
						bits = 7;
					} else {
						bits = 8;
					}
				}
			}
		} else {
			if (bitField < decodeLen[12]) {
				if (bitField < decodeLen[10])
					if (bitField < decodeLen[9])
						bits = 9;
					else
						bits = 10;
				else if (bitField < decodeLen[11])
					bits = 11;
				else
					bits = 12;
			} else {
				if (bitField < decodeLen[14]) {
					if (bitField < decodeLen[13]) {
						bits = 13;
					} else {
						bits = 14;
					}
				} else {
					bits = 15;
				}
			}
		}
		addbits(bits);
		int N = dec.getDecodePos()[bits]
				+ (((int) bitField - decodeLen[bits - 1]) >>> (16 - bits));
		if (N >= dec.getMaxNum()) {
			N = 0;
		}
		return (dec.getDecodeNum()[N]);
	}

	protected boolean ReadTables20() throws IOException, RarException
	{
		byte[] BitLength = new byte[Compress.BC20];
		byte[] Table = new byte[Compress.MC20 * 4];
		int TableSize, N, I;
		if (inAddr > readTop - 25) {
			if (!unpReadBuf()) {
				return (false);
			}
		}
		int BitField = getbits();
		UnpAudioBlock = (BitField & 0x8000);

		if (0 == (BitField & 0x4000)) {
			// memset(UnpOldTable20,0,sizeof(UnpOldTable20));
			Arrays.fill(UnpOldTable20, (byte) 0);
		}
		addbits(2);

		if (UnpAudioBlock != 0) {
			UnpChannels = ((BitField >>> 12) & 3) + 1;
			if (UnpCurChannel >= UnpChannels) {
				UnpCurChannel = 0;
			}
			addbits(2);
			TableSize = Compress.MC20 * UnpChannels;
		} else {
			TableSize = Compress.NC20 + Compress.DC20 + Compress.RC20;
		}
		for (I = 0; I < Compress.BC20; I++) {
			BitLength[I] = (byte) (getbits() >>> 12);
			addbits(4);
		}
		makeDecodeTables(BitLength, 0, BD, Compress.BC20);
		I = 0;
		while (I < TableSize) {
			if (inAddr > readTop - 5) {
				if (!unpReadBuf()) {
					return (false);
				}
			}
			int Number = decodeNumber(BD);
			if (Number < 16) {
				Table[I] = (byte) ((Number + UnpOldTable20[I]) & 0xf);
				I++;
			} else if (Number == 16) {
				N = (getbits() >>> 14) + 3;
				addbits(2);
				while (N-- > 0 && I < TableSize) {
					Table[I] = Table[I - 1];
					I++;
				}
			} else {
				if (Number == 17) {
					N = (getbits() >>> 13) + 3;
					addbits(3);
				} else {
					N = (getbits() >>> 9) + 11;
					addbits(7);
				}
				while (N-- > 0 && I < TableSize)
					Table[I++] = 0;
			}
		}
		if (inAddr > readTop) {
			return (true);
		}
		if (UnpAudioBlock != 0)
			for (I = 0; I < UnpChannels; I++)
				makeDecodeTables(Table, I * Compress.MC20, MD[I], Compress.MC20);
		else {
			makeDecodeTables(Table, 0, LD, Compress.NC20);
			makeDecodeTables(Table, Compress.NC20, DD, Compress.DC20);
			makeDecodeTables(Table, Compress.NC20 + Compress.DC20, RD,
					Compress.RC20);
		}
		// memcpy(UnpOldTable20,Table,sizeof(UnpOldTable20));
		for (int i = 0; i < UnpOldTable20.length; i++) {
			UnpOldTable20[i] = Table[i];
		}
		return (true);
	}

	protected void unpInitData20(boolean Solid)
	{
		if (!Solid) {
			UnpChannelDelta = UnpCurChannel = 0;
			UnpChannels = 1;
			// memset(AudV,0,sizeof(AudV));
			Arrays.fill(AudV, new AudioVariables());
			// memset(UnpOldTable20,0,sizeof(UnpOldTable20));
			Arrays.fill(UnpOldTable20, (byte) 0);
		}
	}

	protected void ReadLastTables() throws IOException, RarException
	{
		if (readTop >= inAddr + 5) {
			if (UnpAudioBlock != 0) {
				if (decodeNumber(MD[UnpCurChannel]) == 256) {
					ReadTables20();
				}
			} else {
				if (decodeNumber(LD) == 269) {
					ReadTables20();
				}
			}
		}
	}

	protected byte DecodeAudio(int Delta)
	{
		AudioVariables v = AudV[UnpCurChannel];
		v.setByteCount(v.getByteCount() + 1);
		v.setD4(v.getD3());
		v.setD3(v.getD2());// ->D3=V->D2;
		v.setD2(v.getLastDelta() - v.getD1());// ->D2=V->LastDelta-V->D1;
		v.setD1(v.getLastDelta());// V->D1=V->LastDelta;
		// int PCh=8*V->LastChar+V->K1*V->D1 +V->K2*V->D2 +V->K3*V->D3
		// +V->K4*V->D4+ V->K5*UnpChannelDelta;
		int PCh = 8 * v.getLastChar() + v.getK1() * v.getD1();
		PCh += v.getK2() * v.getD2() + v.getK3() * v.getD3();
		PCh += v.getK4() * v.getD4() + v.getK5() * UnpChannelDelta;
		PCh = (PCh >>> 3) & 0xFF;

		int Ch = PCh - Delta;

		int D = ((byte) Delta) << 3;

		v.getDif()[0] += Math.abs(D);// V->Dif[0]+=abs(D);
		v.getDif()[1] += Math.abs(D - v.getD1());// V->Dif[1]+=abs(D-V->D1);
		v.getDif()[2] += Math.abs(D + v.getD1());// V->Dif[2]+=abs(D+V->D1);
		v.getDif()[3] += Math.abs(D - v.getD2());// V->Dif[3]+=abs(D-V->D2);
		v.getDif()[4] += Math.abs(D + v.getD2());// V->Dif[4]+=abs(D+V->D2);
		v.getDif()[5] += Math.abs(D - v.getD3());// V->Dif[5]+=abs(D-V->D3);
		v.getDif()[6] += Math.abs(D + v.getD3());// V->Dif[6]+=abs(D+V->D3);
		v.getDif()[7] += Math.abs(D - v.getD4());// V->Dif[7]+=abs(D-V->D4);
		v.getDif()[8] += Math.abs(D + v.getD4());// V->Dif[8]+=abs(D+V->D4);
		v.getDif()[9] += Math.abs(D - UnpChannelDelta);// V->Dif[9]+=abs(D-UnpChannelDelta);
		v.getDif()[10] += Math.abs(D + UnpChannelDelta);// V->Dif[10]+=abs(D+UnpChannelDelta);

		v.setLastDelta((byte) (Ch - v.getLastChar()));
		UnpChannelDelta = v.getLastDelta();
		v.setLastChar(Ch);// V->LastChar=Ch;

		if ((v.getByteCount() & 0x1F) == 0) {
			int MinDif = v.getDif()[0], NumMinDif = 0;
			v.getDif()[0] = 0;// ->Dif[0]=0;
			for (int I = 1; I < v.getDif().length; I++) {
				if (v.getDif()[I] < MinDif) {
					MinDif = v.getDif()[I];
					NumMinDif = I;
				}
				v.getDif()[I] = 0;
			}
			switch (NumMinDif) {
			case 1:
				if (v.getK1() >= -16) {
					v.setK1(v.getK1() - 1);// V->K1--;
				}
				break;
			case 2:
				if (v.getK1() < 16) {
					v.setK1(v.getK1() + 1);// V->K1++;
				}
				break;
			case 3:
				if (v.getK2() >= -16) {
					v.setK2(v.getK2() - 1);// V->K2--;
				}
				break;
			case 4:
				if (v.getK2() < 16) {
					v.setK2(v.getK2() + 1);// V->K2++;
				}
				break;
			case 5:
				if (v.getK3() >= -16) {
					v.setK3(v.getK3() - 1);
				}
				break;
			case 6:
				if (v.getK3() < 16) {
					v.setK3(v.getK3() + 1);
				}
				break;
			case 7:
				if (v.getK4() >= -16) {
					v.setK4(v.getK4() - 1);
				}
				break;
			case 8:
				if (v.getK4() < 16) {
					v.setK4(v.getK4() + 1);
				}
				break;
			case 9:
				if (v.getK5() >= -16) {
					v.setK5(v.getK5() - 1);
				}
				break;
			case 10:
				if (v.getK5() < 16) {
					v.setK5(v.getK5() + 1);
				}
				break;
			}
		}
		return ((byte) Ch);
	}

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -