首页 Soft PlugIn RAN乱 Dev开发 Info资料 English WAP 留言 登陆 注册
-
Posted by Yippee | 评论(0) | 引用(0) | 阅读97次
20080324 ICSharpCode GZipStream

20080324 ICSharpCode GZipStream
http://www.shengfang.org


http://www.cnblogs.com/DreamlikeAttic/archive/2006/07/07/445643.html
在Pocket PC/Smartphone智能设备上编写压缩程序(特别简单,任何人都能简单使用)

2.0里内置了DeflateStream GZipStream压缩算法,没有压缩比的选择,实验了一下一个49,934字节的文件,用gzipstream压缩后35,964,用deflatestream压缩后35,946,用winrar3.62最大压缩26,598,7-zip也可以压缩成gzip,用7-zip选择压缩成gzip并最大压缩后26,485,比winrar都强。显得2.0自带的这个算法真是没用啊。

但是好玩的是,.net里用gzipstream却可以解压用7-zip压缩的gz,这样就可以用7-zip压缩成gz给工程用,比如作成资源,然后光用.net的解压就可以了

xml文件操作时挺有用,可以压缩减少文件尺寸。

压缩:
public static string Compress(string code_type, string text)
{
    byte[] buffer = Encoding.GetEncoding(code_type).GetBytes(text);
    MemoryStream ms = new MemoryStream();
    using (GZipStream zip = new GZipStream(ms, CompressionMode.Compress, true))
    {
        zip.Write(buffer, 0, buffer.Length);
    }

    ms.Position = 0;
    MemoryStream outStream = new MemoryStream();

    byte[] compressed = new byte[ms.Length];
    ms.Read(compressed, 0, compressed.Length);

    byte[] gzBuffer = new byte[compressed.Length];
    System.Buffer.BlockCopy(compressed, 0, gzBuffer, 0, compressed.Length);
 
    return Convert.ToBase64String(gzBuffer);
}

解压:
public static string Decompress(string code_type, string compressedText)
{
    byte[] gzBuffer = Convert.FromBase64String(compressedText);
    using (MemoryStream ms = new MemoryStream())
    {
        int msgLength = BitConverter.ToInt32(gzBuffer, 0);
        ms.Write(gzBuffer, 0, gzBuffer.Length );

        byte[] buffer = new byte[msgLength];

        ms.Position = 0;
        using (GZipStream zip = new GZipStream(ms, CompressionMode.Decompress))
        {
            zip.Read(buffer, 0, buffer.Length);
        }

        return Encoding.GetEncoding(code_type).GetString(buffer);
    }
 

著名的压缩库ICSharpCode.SharpZipLib.GZip我是没有试出来,我认为他没有提供这种不包含头的压缩功能。我压缩出来的都是包含头的。于是我再次寻找到了zlib.net.dll这个是从http://www.zlib.net/官方网站找到的,果然什么东西都得用官方的!
那么代码就是这样的

            byte[] byteData = System.Text.Encoding.UTF8.GetBytes("http://www.dc9.cn");
            MemoryStream ms = new MemoryStream();
            Stream s = new ZOutputStream(ms, 9);
           
            s.Write(byteData, 0, byteData.Length);
            s.Close();
            byte[] compressData = (byte[])ms.ToArray();
            ms.Flush();
            ms.Close();

            FileStream fileStream = new FileStream("C:\\dc9.cn.zip", FileMode.Create, FileAccess.Write);
            Console.Write(System.Convert.ToBase64String(compressData, 0, compressData.Length));
            fileStream.Write(compressData, 0, compressData.Length);
            fileStream.Flush();
            fileStream.Close();

我最先想到的是.net framework2.0以来新加入的一个System.IO.Compression;这里面的GZipStream 不提供level,不提供无头压缩。很郁闷。这个压缩出来是直接能用winrar解压的。带头的才能winrar/winzip解压。

            FileStream fileStream = new FileStream("C:\\dc9.cn.zip",FileMode.Create,FileAccess.Write);
            MemoryStream ms = new MemoryStream();
            GZipStream compressionStream = new GZipStream(ms,CompressionMode.Compress);
            StreamWriter writer = new StreamWriter(compressionStream);
            writer.Write("http://www.dc9.cn");
            writer.Close();

            fileStream.Write(ms.ToArray(), 0, ms.ToArray().Length);
            fileStream.Flush();
            fileStream.Close();

using ICSharpCode.SharpZipLib.GZip;这个我懒得说了,也是带头的
关键就是

FileStream destinationStream = new FileStream("C:\\dc9.cn.zip",FileMode.OpenOrCreate);
GZipOutputStream outStream = new GZipOutputStream(destinationStream);
outStream.Write(buffer, 0, buffer.Length);
outStream.Flush();
outStream.Finish();


字体:

Permanant URI永久地址 http://www.shengfang.org/blog/p/20080324ICSharpCodeGZipStream.php
Trackback URI引用地址 http://www.shengfang.org/blog/tb.php?tb_id=1229775003

2008年12月20日20:10星期六  [Info资料] 追踪此文的RSS
提示:
此文还没有评论。

称呼:    登陆   注册
   不注册,但记住我的信息
邮件:
(非必须)
评论: [UBB代码帮助]
粗体 斜体 下划线 链接 水平线 引用



验证码: 请输入你看见的数字
关闭UBB      提交时自动将内容复制到剪贴板

公告
Fire and Motion!

统计信息
[Yippee]||[统计]||日志:1790
在线: 13||用户: 2562 [列表]
今日:2394||到访:2669341
Rss:837646||评论:1584

最新日志

最新评论

友情链接

日历

最新引用

搜索

归档

杂项
Get RSS Feed (Version 2.0)
Get Atom Feed (Version 0.3)
编码:  UTF-8