public static byte[] Compress(byte[] source, OodleLZ_Compressor compressor, OodleLZ_CompressionLevel level) { IntPtr pOptions = OodleLZ_CompressOptions_GetDefault(compressor, level); OodleLZ_CompressOptions options = Marshal.PtrToStructure <OodleLZ_CompressOptions>(pOptions); // Required for the game to not crash options.seekChunkReset = true; // This is already the default but I am including it for authenticity to game code options.seekChunkLen = 0x40000; pOptions = Marshal.AllocHGlobal(Marshal.SizeOf <OodleLZ_CompressOptions>()); try { Marshal.StructureToPtr(options, pOptions, false); long compressedBufferSizeNeeded = OodleLZ_GetCompressedBufferSizeNeeded(source.LongLength); byte[] compBuf = new byte[compressedBufferSizeNeeded]; long compLen = OodleLZ_Compress(compressor, source, source.LongLength, compBuf, level, pOptions, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, 0); Array.Resize(ref compBuf, (int)compLen); return(compBuf); } finally { Marshal.FreeHGlobal(pOptions); } }
private static extern long OodleLZ_Compress( OodleLZ_Compressor compressor, [MarshalAs(UnmanagedType.LPArray)] byte[] rawBuf, long rawLen, [MarshalAs(UnmanagedType.LPArray)] byte[] compBuf, OodleLZ_CompressionLevel level, IntPtr pOptions, IntPtr dictionaryBase, IntPtr lrm, IntPtr scratchMem, long scratchSize);
private static extern IntPtr OodleLZ_CompressOptions_GetDefault( OodleLZ_Compressor compressor, OodleLZ_CompressionLevel lzLevel);
private static long OodleLZ_Compress(OodleLZ_Compressor compressor, byte[] rawBuf, long rawLen, byte[] compBuf, OodleLZ_CompressionLevel level) => OodleLZ_Compress(compressor, rawBuf, rawLen, compBuf, level, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, 0);