/// <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); } }
/// <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); } } }