public static void Decompress(byte[] compressed, int compressedOffset, int compressedSize, byte[] uncompressed, int uncompressedOffset, int uncompressedSize, FArchive?reader = null) { LoadOodleDll(); unsafe { fixed(byte *compressedPtr = compressed, uncompressedPtr = uncompressed) { var decodedSize = Oodle.OodleLZ_Decompress(compressedPtr + compressedOffset, compressedSize, uncompressedPtr + uncompressedOffset, uncompressedSize, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); if (decodedSize <= 0) { if (reader != null) { throw new OodleException(reader, $"Oodle decompression failed with result {decodedSize}"); } else { throw new OodleException($"Oodle decompression failed with result {decodedSize}"); } } else if (decodedSize < uncompressedSize) { // Not sure whether this should be an exception or not Log.Warning("Oodle decompression just decompressed {0} bytes of the expected {1} bytes", decodedSize, uncompressedSize); } } } }
public static void Decompress(byte[] compressed, int compressedOffset, int compressedSize, byte[] uncompressed, int uncompressedOffset, int uncompressedSize, CompressionMethod method, FArchive?reader = null) { using var srcStream = new MemoryStream(compressed, compressedOffset, compressedSize, false) { Position = 0 }; switch (method) { case CompressionMethod.None: Buffer.BlockCopy(compressed, compressedOffset, uncompressed, uncompressedOffset, compressedSize); return; case CompressionMethod.Zlib: var zlib = new ZlibStream(srcStream, CompressionMode.Decompress); zlib.Read(uncompressed, uncompressedOffset, uncompressedSize); zlib.Dispose(); return; case CompressionMethod.Gzip: var gzip = new GZipStream(srcStream, CompressionMode.Decompress); gzip.Read(uncompressed, uncompressedOffset, uncompressedSize); gzip.Dispose(); return; case CompressionMethod.Oodle: Oodle.Decompress(compressed, compressedOffset, compressedSize, uncompressed, uncompressedOffset, uncompressedSize, reader); return; case CompressionMethod.LZ4: var uncompressedBuffer = new byte[uncompressedSize + uncompressedSize / 255 + 16]; // LZ4_compressBound(uncompressedSize) int result; #if USE_LZ4_NATIVE_LIB unsafe { fixed(byte *compressedPtr = compressed, uncompressedBufferPtr = uncompressedBuffer) { result = LZ4.LZ4_decompress_safe(compressedPtr + compressedOffset, uncompressedBufferPtr, compressedSize, uncompressedBuffer.Length); } } #else result = LZ4Codec.Decode(compressed, compressedOffset, compressedSize, uncompressedBuffer, 0, uncompressedBuffer.Length); #endif Buffer.BlockCopy(uncompressedBuffer, 0, uncompressed, uncompressedOffset, uncompressedSize); if (result != uncompressedSize) { throw new FileLoadException($"Failed to decompress LZ4 data (Expected: {uncompressedSize}, Result: {result})"); } return; default: if (reader != null) { throw new UnknownCompressionMethodException(reader, $"Compression method \"{method}\" is unknown"); } else { throw new UnknownCompressionMethodException($"Compression method \"{method}\" is unknown"); } } }
public static void Decompress(byte[] compressed, int compressedOffset, int compressedSize, byte[] uncompressed, int uncompressedOffset, int uncompressedSize, CompressionMethod method, FArchive?reader = null) { using var srcStream = new MemoryStream(compressed, compressedOffset, compressedSize, false) { Position = 0 }; switch (method) { case CompressionMethod.None: Buffer.BlockCopy(compressed, compressedOffset, uncompressed, uncompressedOffset, compressedSize); return; case CompressionMethod.Zlib: var zlib = new ZlibStream(srcStream, CompressionMode.Decompress); zlib.Read(uncompressed, uncompressedOffset, uncompressedSize); zlib.Dispose(); return; case CompressionMethod.Gzip: var gzip = new GZipStream(srcStream, CompressionMode.Decompress); gzip.Read(uncompressed, uncompressedOffset, uncompressedSize); gzip.Dispose(); return; case CompressionMethod.Oodle: Pro_Swapper.Swap.RawExport = compressed; Oodle.Decompress(compressed, compressedOffset, compressedSize, uncompressed, uncompressedOffset, uncompressedSize, reader); return; case CompressionMethod.LZ4: var uncompressedBuffer = new byte[uncompressedSize + 4]; var result = LZ4Codec.Decode(compressed, compressedOffset, compressedSize, uncompressedBuffer, 0, uncompressedBuffer.Length); Buffer.BlockCopy(uncompressedBuffer, 0, uncompressed, uncompressedOffset, uncompressedSize); if (result != uncompressedSize) { throw new FileLoadException($"Failed to decompress LZ4 data (Expected: {uncompressedSize}, Result: {result})"); } //var lz4 = LZ4Stream.Decode(srcStream); //lz4.Read(uncompressed, uncompressedOffset, uncompressedSize); //lz4.Dispose(); return; default: if (reader != null) { throw new UnknownCompressionMethodException(reader, $"Compression method \"{method}\" is unknown"); } else { throw new UnknownCompressionMethodException($"Compression method \"{method}\" is unknown"); } } }
public static void Decompress(byte[] compressed, int compressedOffset, int compressedSize, byte[] uncompressed, int uncompressedOffset, int uncompressedSize, CompressionMethod method, FArchive?reader = null) { using var srcStream = new MemoryStream(compressed, compressedOffset, compressedSize, false) { Position = 0 }; switch (method) { case CompressionMethod.None: Buffer.BlockCopy(compressed, compressedOffset, uncompressed, uncompressedOffset, compressedSize); return; case CompressionMethod.Zlib: var zlib = new ZlibStream(srcStream, CompressionMode.Decompress); zlib.Read(uncompressed, uncompressedOffset, uncompressedSize); zlib.Dispose(); return; case CompressionMethod.Gzip: var gzip = new GZipStream(srcStream, CompressionMode.Decompress); gzip.Read(uncompressed, uncompressedOffset, uncompressedSize); gzip.Dispose(); return; case CompressionMethod.Oodle: Oodle.Decompress(compressed, compressedOffset, compressedSize, uncompressed, uncompressedOffset, uncompressedSize, reader); return; default: if (reader != null) { throw new OodleException(reader, $"Compression method \"{method}\" is unknown"); } else { throw new OodleException($"Compression method \"{method}\" is unknown"); } } }