コード例 #1
0
        /// <summary>Compresses input buffer into self-contained package.</summary>
        /// <param name="source">Input buffer.</param>
        /// <param name="sourceLength">Length of input data.</param>
        /// <param name="level">Compression level.</param>
        /// <returns>Output buffer.</returns>
        public static unsafe byte[] Pickle(
            byte *source, int sourceLength, LZ4Level level = LZ4Level.L00_FAST)
        {
            if (sourceLength <= 0)
            {
                return(Array.Empty <byte>());
            }

            var targetLength = sourceLength - 1;
            var target       = (byte *)Mem.Alloc(sourceLength);

            try
            {
                var encodedLength = LZ4Codec.Encode(
                    source, sourceLength, target, targetLength, level);

                return(encodedLength <= 0
                                        ? PickleV0(source, sourceLength, sourceLength)
                                        : PickleV0(target, encodedLength, sourceLength));
            }
            finally
            {
                Mem.Free(target);
            }
        }
コード例 #2
0
        /// <summary>Compresses input buffer into self-contained package.</summary>
        /// <param name="source">Input buffer.</param>
        /// <param name="level">Compression level.</param>
        /// <returns>Output buffer.</returns>
        public static unsafe byte[] Pickle(
            ReadOnlySpan <byte> source, LZ4Level level = LZ4Level.L00_FAST)
        {
            var sourceLength = source.Length;

            if (sourceLength == 0)
            {
                return(Mem.Empty);
            }

            if (sourceLength <= MAX_STACKALLOC)
            {
                var buffer = stackalloc byte[MAX_STACKALLOC];
                var target = new Span <byte>(buffer, MAX_STACKALLOC);
                return(PickleWithBuffer(source, level, target));
            }
            else
            {
                var buffer = Mem.Alloc(sourceLength);
                try
                {
                    var target = new Span <byte>(buffer, sourceLength);
                    return(PickleWithBuffer(source, level, target));
                }
                finally
                {
                    Mem.Free(buffer);
                }
            }
        }