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();