private static void Template(string xzFileName, string originFileName, bool useSpan) { byte[] decompDigest; byte[] originDigest; string xzFile = Path.Combine(TestSetup.SampleDir, xzFileName); string originFile = Path.Combine(TestSetup.SampleDir, originFileName); using (MemoryStream decompMs = new MemoryStream()) { XZDecompressOptions decompOpts = new XZDecompressOptions(); using (FileStream compFs = new FileStream(xzFile, FileMode.Open, FileAccess.Read, FileShare.Read)) using (XZStream xz = new XZStream(compFs, decompOpts)) { #if !NETFRAMEWORK if (useSpan) { byte[] buffer = new byte[64 * 1024]; int bytesRead; do { bytesRead = xz.Read(buffer.AsSpan()); decompMs.Write(buffer.AsSpan(0, bytesRead)); } while (0 < bytesRead); } else #endif { xz.CopyTo(decompMs); } decompMs.Flush(); xz.GetProgress(out ulong finalIn, out ulong finalOut); Assert.AreEqual(compFs.Length, xz.TotalIn); Assert.AreEqual(decompMs.Length, xz.TotalOut); Assert.AreEqual((ulong)compFs.Length, finalIn); Assert.AreEqual((ulong)decompMs.Length, finalOut); } decompMs.Position = 0; using (HashAlgorithm hash = SHA256.Create()) { decompDigest = hash.ComputeHash(decompMs); } } using (FileStream originFs = new FileStream(originFile, FileMode.Open, FileAccess.Read, FileShare.Read)) { using (HashAlgorithm hash = SHA256.Create()) { originDigest = hash.ComputeHash(originFs); } } Assert.IsTrue(decompDigest.SequenceEqual(originDigest)); }
/// <inheritdoc/> public override byte[] Decompress(byte[] compressedData, int blockLength) { XZDecompressOptions decompOpts = new XZDecompressOptions(); using (MemoryStream inputStream = new MemoryStream(compressedData, 0, blockLength)) using (MemoryStream outputStream = new MemoryStream()) using (XZStream xzStream = new XZStream(inputStream, decompOpts)) { xzStream.CopyTo(outputStream); xzStream.Flush(); return(outputStream.ToArray()); } }