public unsafe bool Unapply(ReadOnlySpan <byte> src, ref Span <byte> dst)
        {
            var header = src[0];

            fixed(byte *srcPtr = src, dstPtr = dst)
            {
                if (header == kHeaderUncompressed)
                {
                    if (dst.Length < src.Length - 1)
                    {
                        return(false);
                    }
                    UnsafeUtility.MemCpy(dstPtr, srcPtr + 1, src.Length - 1);
                    return(true);
                }
                // Compressed need to decompress
                var count = CLZF2.TryDecompress(srcPtr + 1, dstPtr, src.Length - 1, dst.Length);

                if (count <= 0 || count > dst.Length)
                {
                    return(false);
                }
                dst = dst.Slice(0, count);
                return(true);
            }
        }
        public unsafe void Unapply(ref byte[] data, ref int size)
        {
            Assert.IsTrue(data.Length >= size);
            if (data.Length <= 0)
            {
                return;
            }
            var header = data[0];

            fixed(byte *ptr = data)
            {
                if (header == 0)
                {
                    UnsafeUtility.MemMove(ptr, ptr + 1, size - 1);
                    size--;
                }
                else
                {
                    // Compressed need to decompress
                    var outputSize = size;
                    while (true)
                    {
                        outputSize *= 2;
                        var temp  = stackalloc byte[outputSize];
                        var count = CLZF2.TryDecompress(ptr + 1, temp, size - 1, outputSize);
                        if (count == 0)
                        {
                            continue;
                        }
                        if (count >= data.Length)
                        {
                            var pool = ArrayPool <byte> .Shared;
                            pool.Return(data);
                            data = pool.Rent(count);
                        }

                        fixed(byte *outPtr = data)
                        {
                            UnsafeUtility.MemCpy(outPtr, temp, count);
                        }

                        size = count;
                    }
                }
            }
        }