zoukankan      html  css  js  c++  java
  • 利用SharpZipLib进行字符串的压缩和解压缩

    http://www.izhangheng.com/sharpziplib-string-compression-decompression/

    今天搞了一晚上压缩和解压缩问题,java压缩的字符串,用C#始终没解开,后来考虑到实际的应用,还是数据库存储压力,不适合存储压缩后的长字符串,决定去掉压缩,用明文,在其他地方处理保密问题。
    
    不过,今天找了一个很好用的压缩/解压缩方法,首先需要去http://www.icsharpcode.net/下载SharpZipLib,然后引用ICSharpCode.SharpZipLib.dll
    
    类如下,可以直接使用。
    
    [csharp]
    using System;
    using System.Text;
    using System.IO;
    using ICSharpCode.SharpZipLib.BZip2;
    using ICSharpCode.SharpZipLib.GZip;
    using ICSharpCode.SharpZipLib.Zip;
    
    namespace henry24264.com.Common
    {
    /// <summary>
    /// 压缩方式。
    /// </summary>
    public enum CompressionType
    {
    /// <summary>
    /// GZip 压缩格式
    /// </summary>
    GZip,
    /// <summary>
    /// BZip2 压缩格式
    /// </summary>
    BZip2,
    /// <summary>
    /// Zip 压缩格式
    /// </summary>
    Zip
    }
    /// <summary>
    /// 使用 SharpZipLib 进行压缩的辅助类,简化对字节数组和字符串进行压缩的操作。
    /// </summary>
    public class CompressionHelper
    {
    /// <summary>
    /// 压缩供应者,默认为 GZip。
    /// </summary>
    public static CompressionType CompressionProvider = CompressionType.GZip;
    
    /// <summary>
    /// 从原始字节数组生成已压缩的字节数组。
    /// </summary>
    /// <param name="bytesToCompress">原始字节数组。</param>
    /// <returns>返回已压缩的字节数组</returns>
    public static byte[] Compress(byte[] bytesToCompress)
    {
    MemoryStream ms = new MemoryStream();
    Stream s = OutputStream(ms);
    s.Write(bytesToCompress, 0, bytesToCompress.Length);
    s.Close();
    return ms.ToArray();
    }
    /// <summary>
    /// 从原始字符串生成已压缩的字符串。
    /// </summary>
    /// <param name="stringToCompress">原始字符串。</param>
    /// <returns>返回已压缩的字符串。</returns>
    public static string Compress(string stringToCompress)
    {
    byte[] compressedData = CompressToByte(stringToCompress);
    string strOut = Convert.ToBase64String(compressedData);
    return strOut;
    }
    /// <summary>
    /// 从原始字符串生成已压缩的字节数组。
    /// </summary>
    /// <param name="stringToCompress">原始字符串。</param>
    /// <returns>返回已压缩的字节数组。</returns>
    public static byte[] CompressToByte(string stringToCompress)
    {
    byte[] bytData = Encoding.Unicode.GetBytes(stringToCompress);
    return Compress(bytData);
    }
    /// <summary>
    /// 从已压缩的字符串生成原始字符串。
    /// </summary>
    /// <param name="stringToDecompress">已压缩的字符串。</param>
    /// <returns>返回原始字符串。</returns>
    public string DeCompress(string stringToDecompress)
    {
    string outString = string.Empty;
    if (stringToDecompress == null)
    {
    throw new ArgumentNullException("stringToDecompress", "You tried to use an empty string");
    }
    try
    {
    byte[] inArr = Convert.FromBase64String(stringToDecompress.Trim());
    outString = Encoding.Unicode.GetString(DeCompress(inArr));
    }
    catch (NullReferenceException nEx)
    {
    return nEx.Message;
    }
    return outString;
    }
    /// <summary>
    /// 从已压缩的字节数组生成原始字节数组。
    /// </summary>
    /// <param name="bytesToDecompress">已压缩的字节数组。</param>
    /// <returns>返回原始字节数组。</returns>
    public static byte[] DeCompress(byte[] bytesToDecompress)
    {
    byte[] writeData = new byte[4096];
    Stream s2 = InputStream(new MemoryStream(bytesToDecompress));
    MemoryStream outStream = new MemoryStream();
    while (true)
    {
    int size = s2.Read(writeData, 0, writeData.Length);
    if (size > 0)
    {
    outStream.Write(writeData, 0, size);
    }
    else
    {
    break;
    }
    }
    s2.Close();
    byte[] outArr = outStream.ToArray();
    outStream.Close();
    return outArr;
    }
    
    /// <summary>
    /// 从给定的流生成压缩输出流。
    /// </summary>
    /// <param name="inputStream">原始流。</param>
    /// <returns>返回压缩输出流。</returns>
    private static Stream OutputStream(Stream inputStream)
    {
    switch (CompressionProvider)
    {
    case CompressionType.BZip2:
    return new BZip2OutputStream(inputStream);
    case CompressionType.GZip:
    return new GZipOutputStream(inputStream);
    case CompressionType.Zip:
    return new ZipOutputStream(inputStream);
    default:
    return new GZipOutputStream(inputStream);
    }
    }
    /// <summary>
    /// 从给定的流生成压缩输入流。
    /// </summary>
    /// <param name="inputStream">原始流。</param>
    /// <returns>返回压缩输入流。</returns>
    private static Stream InputStream(Stream inputStream)
    {
    switch (CompressionProvider)
    {
    case CompressionType.BZip2:
    return new BZip2InputStream(inputStream);
    case CompressionType.GZip:
    return new GZipInputStream(inputStream);
    case CompressionType.Zip:
    return new ZipInputStream(inputStream);
    default:
    return new GZipInputStream(inputStream);
    }
    }
    }
    }
    [/csharp]
  • 相关阅读:
    解决问题,别扩展问题
    Hystrix 配置参数全解析
    请求合并哪家强
    在Spring-Boot中实现通用Auth认证的几种方式
    Java高级特性之泛型
    一键部署进化史
    JavaScript Alert 函数执行顺序问题
    新版的 Springsecurity request.getRequestDispatcher).forward(request, response); 404 问题,已解决
    maridb 10.3 主从复制,待机情况下从库 cpu 占用率高的处理方法
    springboot 2.0 mariadb hikari-cp连接池
  • 原文地址:https://www.cnblogs.com/123ing/p/4051160.html
Copyright © 2011-2022 走看看