/// <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()); } }
/// <inheritdoc/> public override void Compress(MemoryStream inputStream, MemoryStream outputStream) { XZCompressOptions compOpts = new XZCompressOptions { Level = (LzmaCompLevel)(int)Level, ExtremeFlag = Extreme, LeaveOpen = true }; XZThreadedCompressOptions threadOpts = new XZThreadedCompressOptions { Threads = Threads, }; inputStream.Position = 0; outputStream.SetLength(0); using (XZStream xzStream = new XZStream(outputStream, compOpts, threadOpts)) { inputStream.CopyTo(xzStream); xzStream.Flush(); } }
private static void CompressTemplate(string sampleFileName, bool useSpan, bool success, int threads, LzmaCompLevel level, bool extreme) { string destDir = Path.GetTempFileName(); File.Delete(destDir); Directory.CreateDirectory(destDir); try { string tempDecompFile = Path.Combine(destDir, Path.GetFileName(sampleFileName)); string tempXzFile = tempDecompFile + ".xz"; XZCompressOptions compOpts = new XZCompressOptions { Level = level, ExtremeFlag = extreme, LeaveOpen = true, }; XZThreadedCompressOptions threadOpts = new XZThreadedCompressOptions { Threads = threads, }; string sampleFile = Path.Combine(TestSetup.SampleDir, sampleFileName); using (FileStream xzCompFs = new FileStream(tempXzFile, FileMode.Create, FileAccess.Write, FileShare.None)) using (FileStream sampleFs = new FileStream(sampleFile, FileMode.Open, FileAccess.Read, FileShare.Read)) using (XZStream xzs = new XZStream(xzCompFs, compOpts, threadOpts)) { #if !NETFRAMEWORK if (useSpan) { byte[] buffer = new byte[64 * 1024]; int bytesRead; do { bytesRead = sampleFs.Read(buffer.AsSpan()); xzs.Write(buffer.AsSpan(0, bytesRead)); } while (0 < bytesRead); } else #endif { sampleFs.CopyTo(xzs); } xzs.Flush(); xzs.GetProgress(out ulong finalIn, out ulong finalOut); Assert.AreEqual(sampleFs.Length, xzs.TotalIn); Assert.AreEqual(xzCompFs.Length, xzs.TotalOut); Assert.AreEqual((ulong)sampleFs.Length, finalIn); Assert.AreEqual((ulong)xzCompFs.Length, finalOut); } Assert.IsTrue(TestHelper.RunXZ(tempXzFile) == 0); byte[] decompDigest; byte[] originDigest; using (FileStream fs = new FileStream(sampleFile, FileMode.Open, FileAccess.Read, FileShare.Read)) { using (HashAlgorithm hash = SHA256.Create()) { originDigest = hash.ComputeHash(fs); } } using (FileStream fs = new FileStream(tempDecompFile, FileMode.Open, FileAccess.Read, FileShare.Read)) { using (HashAlgorithm hash = SHA256.Create()) { decompDigest = hash.ComputeHash(fs); } } Assert.IsTrue(originDigest.SequenceEqual(decompDigest)); Assert.IsTrue(success); } #pragma warning disable CA1031 // Do not catch general exception types catch (Exception) { Assert.IsFalse(success); } #pragma warning restore CA1031 // Do not catch general exception types finally { if (Directory.Exists(destDir)) { Directory.Delete(destDir, true); } } }