예제 #1
0
        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);
                    }
                }
            }
        }
예제 #2
0
        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");
                }
            }
        }
예제 #3
0
        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");
                }
            }
        }
예제 #4
0
        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");
                }
            }
        }