/// <summary> /// use hight level compress data /// </summary> /// <param name="source"></param> /// <returns></returns> public static byte[] CompressHightLevel(ReadOnlySpan <byte> source) { using var outStream = new MemoryStream(); using var brotliStream = new System.IO.Compression.BrotliStream(outStream, System.IO.Compression.CompressionLevel.Optimal); brotliStream.Write(source); brotliStream.Close(); return(outStream.ToArray()); }
/// <summary> /// /// </summary> /// <param name="sfile"></param> /// <param name="targetfile"></param> private static void UnZipFile(string sfile, string targetfile) { try { Stopwatch sw = new Stopwatch(); sw.Start(); using (System.IO.Compression.BrotliStream bs = new System.IO.Compression.BrotliStream(System.IO.File.Open(sfile, System.IO.FileMode.Open), System.IO.Compression.CompressionMode.Decompress)) { using (var vss = System.IO.File.Open(targetfile, System.IO.FileMode.OpenOrCreate, System.IO.FileAccess.ReadWrite)) { bs.CopyTo(vss); vss.Flush(); } bs.Close(); } sw.Stop(); LoggerService.Service.Info(" HisDataFileInfo4", "Zip 解压文件文件 " + targetfile + " 耗时:" + sw.ElapsedMilliseconds); } catch (Exception ex) { LoggerService.Service.Info(" HisDataFileInfo4", "Zip 解压文件文件 " + ex.Message); } }
public async Task CompressionTest(BucketCompressionAlgorithm alg) { bool overshoot = false; var baseStream = new MemoryStream(); for (int i = 0; i < 10; i++) { baseStream.Write(Guid.NewGuid().ToByteArray(), 0, 16); } for (int i = 0; i < 10; i++) { baseStream.Write(new byte[] { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, 8); } var baseData = baseStream.ToArray(); Bucket compressed; switch (alg) { case BucketCompressionAlgorithm.ZLib: #if !NET6_0_OR_GREATER compressed = baseData.AsBucket().Compress(alg); #else { var ms = new MemoryStream(); var zs = new System.IO.Compression.ZLibStream(ms, System.IO.Compression.CompressionLevel.Optimal); zs.Write(baseData, 0, baseData.Length); zs.Close(); compressed = ms.ToArray().AsBucket(); } #endif break; case BucketCompressionAlgorithm.GZip: { var ms = new MemoryStream(); var zs = new System.IO.Compression.GZipStream(ms, System.IO.Compression.CompressionLevel.Optimal); zs.Write(baseData, 0, baseData.Length); zs.Close(); compressed = ms.ToArray().AsBucket(); break; } case BucketCompressionAlgorithm.Deflate: { var ms = new MemoryStream(); var zs = new System.IO.Compression.DeflateStream(ms, System.IO.Compression.CompressionLevel.Optimal); zs.Write(baseData, 0, baseData.Length); zs.Close(); compressed = ms.ToArray().AsBucket(); break; } #if NET6_0_OR_GREATER case BucketCompressionAlgorithm.Brotli: { var ms = new MemoryStream(); var zs = new System.IO.Compression.BrotliStream(ms, System.IO.Compression.CompressionLevel.Optimal); zs.Write(baseData, 0, baseData.Length); zs.Close(); compressed = ms.ToArray().AsBucket(); overshoot = true; break; } #endif default: throw new InvalidOperationException(); } var finishData = overshoot ? Array.Empty <byte>() : Guid.NewGuid().ToByteArray(); var compressedData = await compressed.Append(finishData.AsBucket()).ToArrayAsync(); ushort firstTwo = NetBitConverter.ToUInt16(compressedData, 0); switch (alg) { case BucketCompressionAlgorithm.GZip: Assert.AreEqual(0x1F8B, firstTwo, $"Got 0x{firstTwo:x4}"); break; case BucketCompressionAlgorithm.ZLib: bool isZlib = new ushort[] { 0x7801, 0x789C, 0x78da }.Contains(firstTwo); Assert.IsTrue(isZlib, $"Got 0x{firstTwo:x4}"); break; case BucketCompressionAlgorithm.Deflate: // FirstTwo can be anything break; } var inner = compressedData.AsBucket(); var bb = await inner.Decompress(alg).ReadFullAsync(4096); Assert.AreEqual(baseData.Length, bb.Length); var decompressed = bb.ToArray(); Assert.IsTrue(decompressed.SequenceEqual(baseData), "Same data after decompression"); bb = await inner.ReadFullAsync(4096); Assert.AreEqual(finishData.Length, bb.Length); Assert.IsTrue(bb.ToArray().SequenceEqual(finishData)); var r = await baseData.AsBucket().Compress(alg).ToArrayAsync(); Stream rs; switch (alg) { case BucketCompressionAlgorithm.ZLib: rs = r.AsBucket().Decompress(BucketCompressionAlgorithm.ZLib).AsStream(); break; case BucketCompressionAlgorithm.GZip: rs = new System.IO.Compression.GZipStream(new MemoryStream(r), System.IO.Compression.CompressionMode.Decompress); break; case BucketCompressionAlgorithm.Deflate: rs = new System.IO.Compression.DeflateStream(new MemoryStream(r), System.IO.Compression.CompressionMode.Decompress); break; #if NET6_0_OR_GREATER case BucketCompressionAlgorithm.Brotli: rs = new System.IO.Compression.BrotliStream(new MemoryStream(r), System.IO.Compression.CompressionMode.Decompress); break; #endif default: throw new InvalidOperationException(); } byte[] resultBytes = new byte[4096]; Assert.AreEqual(baseData.Length, rs.Read(resultBytes, 0, resultBytes.Length)); }