コード例 #1
0
 /// <summary>
 ///
 /// </summary>
 /// <param name="inputBuffer"></param>
 /// <param name="outputBuffer"></param>
 /// <returns></returns>
 /// <exception cref="NotImplementedException"></exception>
 public static int Decompress(byte[] inputBuffer, byte[] outputBuffer)
 {
     if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
     {
         return(OodleNative.OodleLZ_Decompress(inputBuffer, inputBuffer.Length, outputBuffer,
                                               outputBuffer.Length, OodleNative.OodleLZ_FuzzSafe.No, OodleNative.OodleLZ_CheckCRC.No,
                                               OodleNative.OodleLZ_Verbosity.None, 0, 0, 0, 0, 0, 0, OodleNative.OodleLZ_Decode.Unthreaded));
     }
     else if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX))
     {
         return(OozNative.Kraken_Decompress(inputBuffer, inputBuffer.Length, outputBuffer,
                                            outputBuffer.Length));
     }
     else
     {
         throw new NotImplementedException();
     }
 }
コード例 #2
0
 /// <summary>
 /// Gets the max buffer size needed for oodle compression
 /// </summary>
 /// <param name="count"></param>
 /// <returns></returns>
 /// <exception cref="NotImplementedException"></exception>
 public static int GetCompressedBufferSizeNeeded(int count)
 {
     if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
     {
         return((int)OodleNative.GetCompressedBufferSizeNeeded((long)count));
     }
     else if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX))
     {
         try
         {
             return(OozNative.GetCompressedBufferSizeNeeded(count));
         }
         catch (Exception e)
         {
             Console.WriteLine(e);
             throw;
         }
     }
     else
     {
         throw new NotImplementedException();
     }
 }
コード例 #3
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="inputBytes"></param>
        /// <param name="inputOffset"></param>
        /// <param name="inputCount"></param>
        /// <param name="outputBytes"></param>
        /// <param name="outputOffset"></param>
        /// <param name="outputCount"></param>
        /// <param name="algo"></param>
        /// <param name="level"></param>
        /// <returns></returns>
        /// <exception cref="ArgumentNullException"></exception>
        /// <exception cref="ArgumentOutOfRangeException"></exception>
        /// <exception cref="NotImplementedException"></exception>
        public static int Compress(
            byte[] inputBytes,
            // int inputOffset,
            int inputCount,
            ref IEnumerable <byte> outputBuffer,
            // int outputOffset,
            // int outputCount,
            OodleNative.OodleLZ_Compressor algo   = OodleNative.OodleLZ_Compressor.Kraken,
            OodleNative.OodleLZ_Compression level = OodleNative.OodleLZ_Compression.Optimal5)
        {
            if (inputBytes == null)
            {
                throw new ArgumentNullException(nameof(inputBytes));
            }
            if (inputCount <= 0 || inputCount > inputBytes.Length)
            {
                throw new ArgumentOutOfRangeException(nameof(inputCount));
            }
            if (outputBuffer == null)
            {
                throw new ArgumentNullException(nameof(outputBuffer));
            }

            if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
            {
                var compressedBufferSizeNeeded = OodleHelper.GetCompressedBufferSizeNeeded((int)inputCount);
                var compressedBuffer           = new byte[compressedBufferSizeNeeded];

                var inputHandle   = GCHandle.Alloc(inputBytes, GCHandleType.Pinned);
                var inputAddress  = inputHandle.AddrOfPinnedObject();
                var outputHandle  = GCHandle.Alloc(compressedBuffer, GCHandleType.Pinned);
                var outputAddress = outputHandle.AddrOfPinnedObject();

                var result = (int)OodleNative.Compress(
                    (int)algo,
                    inputAddress,
                    inputCount,
                    outputAddress,
                    compressedBufferSizeNeeded,
                    IntPtr.Zero,
                    IntPtr.Zero,
                    IntPtr.Zero,
                    IntPtr.Zero,
                    (int)level);
                inputHandle.Free();
                outputHandle.Free();

                //resize buffer
                var writelist = new List <byte>()
                {
                    0x4B, 0x41, 0x52, 0x4B  //KRAKEN, TODO: make this variable and dependent on the compression algo
                };
                writelist.AddRange(BitConverter.GetBytes(inputCount));
                writelist.AddRange(compressedBuffer.Take(result));

                outputBuffer = writelist;

                return(outputBuffer.Count());
            }
            else if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX))
            {
                //TODO: use ooz to compress
                outputBuffer = inputBytes;
                return(outputBuffer.Count());


                // try
                // {
                //     var result = OozNative.Compress(
                //         (int)algo,
                //         inputAddress,
                //         outputAddress,
                //         inputCount,
                //         IntPtr.Zero,
                //         IntPtr.Zero
                //     );
                //     inputHandle.Free();
                //     outputHandle.Free();
                //     return result;
                // }
                // catch (Exception e)
                // {
                //     Console.WriteLine(e);
                //     throw;
                // }
            }
            else
            {
                throw new NotImplementedException();
            }
        }
コード例 #4
0
ファイル: OodleHelper.cs プロジェクト: waitxd/Wolven-kit
 // gibbed
 public static int GetCompressedBufferSizeNeeded(int count)
 {
     return((int)OodleNative.GetCompressedBufferSizeNeeded(count));
 }
コード例 #5
0
ファイル: OodleHelper.cs プロジェクト: waitxd/Wolven-kit
        // gibbed
        public static int Compress(
            byte[] inputBytes,
            int inputOffset,
            int inputCount,
            byte[] outputBytes,
            int outputOffset,
            int outputCount,
            OodleNative.OodleLZ_Compressor algo   = OodleNative.OodleLZ_Compressor.Kraken,
            OodleNative.OodleLZ_Compression level = OodleNative.OodleLZ_Compression.Optimal5)
        {
            if (inputBytes == null)
            {
                throw new ArgumentNullException(nameof(inputBytes));
            }

            if (inputOffset < 0 || inputOffset >= inputBytes.Length)
            {
                throw new ArgumentOutOfRangeException(nameof(inputOffset));
            }

            if (inputCount <= 0 || inputOffset + inputCount > inputBytes.Length)
            {
                throw new ArgumentOutOfRangeException(nameof(inputCount));
            }

            if (outputBytes == null)
            {
                throw new ArgumentNullException(nameof(outputBytes));
            }

            if (outputOffset < 0 || outputOffset >= outputBytes.Length)
            {
                throw new ArgumentOutOfRangeException(nameof(outputOffset));
            }

            if (outputCount <= 0 || outputOffset + outputCount > outputBytes.Length)
            {
                throw new ArgumentOutOfRangeException(nameof(outputCount));
            }

            var inputHandle   = GCHandle.Alloc(inputBytes, GCHandleType.Pinned);
            var inputAddress  = inputHandle.AddrOfPinnedObject() + inputOffset;
            var outputHandle  = GCHandle.Alloc(outputBytes, GCHandleType.Pinned);
            var outputAddress = outputHandle.AddrOfPinnedObject() + outputOffset;

            var result = (int)OodleNative.Compress(
                (int)algo,
                inputAddress,
                inputCount,
                outputAddress,
                outputCount,
                IntPtr.Zero,
                IntPtr.Zero,
                IntPtr.Zero,
                IntPtr.Zero,
                (int)level);

            inputHandle.Free();
            outputHandle.Free();
            return(result);
        }