package com.wmdigit.transfer.converter.decompress; import androidx.annotation.RequiresApi; import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.util.BitSet; public class DecompressUtils { private static final int MAX_WINDOW_SIZE = 1024; private static double log(double d, double d2) { return Math.log(d) / Math.log(d2); } public static int log2Ceil(double d) { if (d <= 0.0d) { return -1; } return (int) Math.ceil(log(d, 2.0d)); } @RequiresApi(api = 19) public static int decompress(byte[] bArr, byte[] bArr2, int i) { short s; BitSet valueOf = BitSet.valueOf(bArr2); BitSet bitSet = new BitSet(32); int i2 = i; int i3 = 0; short s2 = 0; int i4 = 0; int i5 = 0; while (i3 < i2) { boolean bit = getBit(valueOf, i4); int i6 = i4 + 1; if (!bit) { bArr[i3] = getByte(valueOf, i6); i4 = i6 + 8; s2 = (short) (s2 + 1); } else { short s3 = -1; while (bit) { s3 = (short) (s3 + 1); bit = getBit(valueOf, i6); i6++; } if (s3 > 0) { bitSet.clear(); int i7 = 32 - s3; for (int i8 = 0; i8 < s3; i8++) { bitSet.set(i7 + i8, getBit(valueOf, i6 + i8)); } i6 += s3; s = (short) (((short) ((int) (((long) ((short) (1 << s3))) + getNormalLong(bitSet)))) + 1); } else { s = 2; } int log2Ceil = log2Ceil((double) s2); bitSet.clear(); int i9 = 32 - log2Ceil; for (int i10 = 0; i10 < log2Ceil; i10++) { bitSet.set(i9 + i10, getBit(valueOf, i6 + i10)); } i4 = i6 + log2Ceil; short normalLong = (short) ((int) getNormalLong(bitSet)); for (short s4 = 0; s4 < s; s4 = (short) (s4 + 1)) { bArr[i3 + s4] = bArr[i5 + normalLong + s4]; } s2 = (short) (s2 + s); i3 += s - 1; } if (s2 > MAX_WINDOW_SIZE) { i5 += s2 - 1024; s2 = 1024; } i3++; } return s2; } public static boolean getBit(BitSet bitSet, int i) { return bitSet.get(((i / 8) * 8) + (7 - (i % 8))); } public static byte getByte(BitSet bitSet, int i) { byte b = 0; for (int i2 = 0; i2 < 8; i2++) { b = (byte) (b + ((getBit(bitSet, i + i2) ? 1 : 0) << (7 - i2))); } return b; } public static long getNormalLong(BitSet bitSet) { ByteBuffer order = ByteBuffer.allocate(8).order(ByteOrder.BIG_ENDIAN); //TODO 0墙砖了 order.put((byte) 0).put((byte) 0).put((byte) 0).put((byte) 0).put(getNormalByte(bitSet, 0)).put(getNormalByte(bitSet, 8)).put(getNormalByte(bitSet, 16)).put(getNormalByte(bitSet, 24)).flip(); return order.getLong(); } public static byte getNormalByte(BitSet bitSet, int i) { byte b = 0; for (int i2 = 0; i2 < 8; i2++) { b = (byte) (b + ((bitSet.get(i + i2) ? 1 : 0) << (7 - i2))); } return b; } }