コード例 #1
0
 /// <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());
 }
コード例 #2
0
        /// <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);
            }
        }
コード例 #3
0
        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));
        }