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