package com.gamebuster19901.excite.crc; import java.io.IOException; import java.io.InputStream; import java.nio.ByteBuffer; import org.apache.commons.io.IOUtils; public class CRCTester { private final byte[] data; public CRCTester(InputStream inputStream) throws IOException { this(IOUtils.toByteArray(inputStream)); } public CRCTester(byte[] data) { this.data = data; } public int test(final int seed) { ByteBuffer param1 = ByteBuffer.wrap(data); int length = data.length; byte pos1; byte pos2; byte pos3; byte pos4; byte pos5; byte pos6; byte bVar7; boolean bVar8; int leftoverBytes; int bytesEvaluated; @Unsigned int uVar11; @Unsigned int cyclesRemaining; uVar11 = seed; int dataPointer = 0; if(3 < length) { pos1 = param1.get(0); length = length - 4; pos2 = param1.get(1); bVar7 = pos1; pos3 = param1.get(2); param1.getInt(); dataPointer = dataPointer + 4; uVar11 = ~(bVar7 << 0x18 | pos1 << 0x10 | pos2 << 8 | pos3); } bytesEvaluated = 0; if(0 < length) { if (8 < length) { bVar8 = false; if (-1 < length && length < 0x7fffffff) { bVar8 = true; } cyclesRemaining = length - 1 >>> 3; if(bVar8 && 0 < length - 8) { //this is almost certainty a for loop. Also cyclesRemaining = (maxLength - 1) / 8 do { bytesEvaluated = bytesEvaluated + 8; uVar11 = (uVar11 << 8 | param1.getInt(0)) ^ (seed + (uVar11 >>> 0x16 & 0x3fc)); pos1 = param1.get(dataPointer + 1); pos2 = param1.get(dataPointer + 2); pos3 = param1.get(dataPointer + 3); uVar11 = (uVar11 << 8 | param1.getInt(1)) ^ (seed + (uVar11 >>> 0x16 & 0x3fc)); pos4 = param1.get(dataPointer + 4); pos5 = param1.get(dataPointer + 5); pos6 = param1.get(dataPointer + 6); param1.getLong(); dataPointer = dataPointer + 8; uVar11 = (uVar11 << 8 | pos1) ^ (seed + (uVar11 >>> 0x16 & 0x3fc)); uVar11 = (uVar11 << 8 | pos2) ^ (seed + (uVar11 >>> 0x16 & 0x3fc)); uVar11 = (uVar11 << 8 | pos3) ^ (seed + (uVar11 >>> 0x16 & 0x3fc)); uVar11 = (uVar11 << 8 | pos4) ^ (seed + (uVar11 >>> 0x16 & 0x3fc)); uVar11 = (uVar11 << 8 | pos5) ^ (seed + (uVar11 >>> 0x16 & 0x3fc)); uVar11 = (uVar11 << 8 | pos6) ^ (seed + (uVar11 >>> 0x16 & 0x3fc)); cyclesRemaining = cyclesRemaining - 1; } while (cyclesRemaining != 0); } } leftoverBytes = length - bytesEvaluated; if(bytesEvaluated < length) { do { bVar7 = param1.get(dataPointer); dataPointer = dataPointer++; uVar11 = (uVar11 << 8 | bVar7) ^ (seed + (uVar11 >>> 0x16 & 0x3fc)); leftoverBytes = leftoverBytes - 1; } while (leftoverBytes != 0); } } return ~uVar11; } }