zoukankan      html  css  js  c++  java
  • 使用Gzip对流进行压缩、解压缩

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.IO;
    using System.IO.Compression;
    
    namespace byteCompress
    {
        class Program
        {
            static void Main(string[] args)
            {
                Console.WriteLine("请输入文件的路径:");
    
                string path = Console.ReadLine();
                Console.WriteLine("文件路径:" + path);
                using (FileStream fileStream = new FileStream(path,FileMode.Open,FileAccess.Read, FileShare.Read))
                {
                    byte[] buffer = new byte[fileStream.Length];
                    fileStream.Read(buffer, 0, buffer.Length);
                    Console.WriteLine("原始的长度:" + buffer.Length);
                    byte[] compressedBytes = GetCompressBytes(buffer);
                    Console.WriteLine("压缩后的长度:" + compressedBytes.Length);
    
                    byte[] decompressFiles = GetDecompressBytes(compressedBytes);
                    Console.WriteLine("解压缩后的长度:" + decompressFiles.Length);
    
                    bool isEqual = CompareData(decompressFiles, buffer);
                    Console.WriteLine("解压缩后是否与原始的字节流相等:" + isEqual);
                }
                Console.ReadLine();
            }
    
            /// <summary>
            /// 压缩字节流
            /// </summary>
            /// <param name="originalBytes">原始字节流</param>
            /// <returns>压缩后的字节流</returns>
            private static byte[] GetCompressBytes(byte[] originalBytes)
            {
                MemoryStream memoryStream = new MemoryStream();
                using (GZipStream gzipStream = new GZipStream(memoryStream, CompressionMode.Compress))
                {
                    gzipStream.Write(originalBytes, 0, originalBytes.Length);
                }
                return memoryStream.ToArray();
            }
    
            /// <summary>
            /// 解压缩字节流
            /// </summary>
            /// <param name="compressedArray">压缩过的字节流</param>
            /// <returns>解压缩后的字节流</returns>
            private static byte[] GetDecompressBytes(byte[] compressedArray)
            {
                MemoryStream compressedstream = new MemoryStream(compressedArray);
                GZipStream decompressStream = new GZipStream(compressedstream, CompressionMode.Decompress);
                MemoryStream outStream = new MemoryStream();
                CopyStream(decompressStream, outStream);
                return outStream.ToArray();
            }
    
            /// <summary>
            /// 复制流,用于网络流、压缩流等无法获取长度的流
            /// </summary>
            /// <param name="instream">网络流、压缩流等无法获取长度的流</param>
            /// <param name="outstream">可以获取长度的复制流</param>
            private static void CopyStream(Stream instream, Stream outstream)
            {
                const int bufferLen = 4096;
                byte[] buffer = new byte[bufferLen];
                int count = 0;
                while ((count = instream.Read(buffer, 0, bufferLen)) > 0)
                {
                    outstream.Write(buffer, 0, count);
                }
            }
    
            /// <summary>
            /// 比较两个字节流是否相等
            /// </summary>
            /// <param name="array1">字节流1</param>
            /// <param name="array2">字节流2</param>
            /// <returns>相等返回true,不相等返回false</returns>
            private static bool CompareData(byte[] array1, byte[] array2)
            {
                if (array1.Length != array2.Length)
                    return false;
                for (int i = 0; i < array1.Length; i++)
                {
                    if (array1[i] != array2[i])
                        return false;
                }
                return true;
            }
        }
    }
    

     结果

  • 相关阅读:
    数据库三大范式
    idea连接sqlite
    Javascript中==和===的区别
    手机商城项目(修饰技术)
    FastJSON、Gson、Jackson(简单了解使用)
    SiteMesh配置下载使用(简单介绍)
    html5中event获取data和class
    jsp的4个作用域区别( pageScope、requestScope、sessionScope、applicationScope)
    <jsp:include>和<%@include file=""%>的区别(简单了解)
    Check-Point-Security-Gateway-BYOL-R77.30-041.161
  • 原文地址:https://www.cnblogs.com/50614090/p/2717847.html
Copyright © 2011-2022 走看看