在抓取页面的过程中,在存储抓取到的页面内容的时候我需要先将页面压缩再存储,为了使用上的方便,采用了2.0下的GZipStream来进行压缩。
引用如下:
-
usingSystem.IO;
-
usingSystem.IO.Compression;
- ......
-
publicstaticbyte[]Compress(byte[]data)
- {
-
MemoryStreamstream=newMemoryStream();
-
GZipStreamgZipStream=newGZipStream(stream,CompressionMode.Compress);
- gZipStream.Write(data,0,data.Length);
-
-
returnstream.ToArray();
- }
-
publicstaticbyte[]Decompress(byte[]data)
- {
-
MemoryStreamstream=newMemoryStream();
-
GZipStreamgZipStream=newGZipStream(newMemoryStream(data),CompressionMode.Decompress);
-
byte[]bytes=newbyte[4096];
-
intn;
-
while((n=gZipStream.Read(bytes,0,bytes.Length))!=0)
- {
- stream.Write(bytes,0,n);
- }
-
returnstream.ToArray();
- }
上面的代码使用起来似乎是没有什么问题的(如果你不仔细做测试的话),但是当我对各种大小的页面进行测试后,发现如果压缩后byte[]长度<4K,那么问题出来了:没法解压,解压函数中Read返回结果总是0。闻一多先生曾经在演讲中说“郁闷啊,郁闷,这是某集团的郁闷,恰恰是微软的光荣(笔者注:我觉得应该属于微软bug)”。
我一度怀疑是不是Decompress函数中的bytes数组长度设置长了,后来把长度设置的很小,但是解压后还是那样,返回0。真想去和盖茨理论理论。
不过幸运的是,我测试发现了这个4K下限制,所以Google了下“GZipStream 4K”,哈哈,在国外的一论坛(http://www.dotnetmonster.com/Uwe/Forum.aspx/dotnet-framework/19787/Problem-with-the-GZipStream-class-and-small-streams)里面终于找到了答案:原来GZipStream存取数据的时候是以4K为块进行存取的。所以在压缩的时候,在返回stream.ToArray()前应该先gZipStream.Close()(也就是上面俺卖关子的那里),原因是GZipStream是在Dispose的时候把数据完全写入。你说冤吗?我明明已经Write了,竟然还要我再Close才可以。。。
继续郁闷......还不知道会出现什么更加有意思东西哦
分享到:
相关推荐
在.NET框架中,`GZipStream`类是用于实现GZIP压缩和解压缩的主要工具。GZIP是一种广泛使用的数据压缩格式,它可以在网络传输时减少数据量,从而提高传输效率。`GZipStream`是.NET Framework提供的System.IO....
`GZipStream`是这个命名空间中的一个关键类,它实现了GZIP压缩算法,可以用于处理数据流的压缩和解压缩。本篇文章将详细介绍如何利用`GZipStream`和C#进行文件或文件夹的压缩操作。 一、GZipStream介绍 GZipStream...
C#使用GZipStream实现文件的压缩与解压 C#使用GZipStream实现文件的压缩与解压是指使用C#语言中的GZipStream类对文件进行压缩和解压缩操作。GZipStream是.NET Framework中的一个类,用于压缩和解压缩数据流。它支持...
标题中的“GZipStream压缩文件成gzip格式”指的是在编程中使用GZipStream类来对文件进行压缩,生成遵循gzip标准的压缩文件。gzip是一种广泛使用的数据压缩格式,主要用于减少文件大小,加快网络传输速度。它基于...
在内存中处理JPEG图像时,我们可以利用.NET框架提供的System.IO.Compression命名空间,其中包含GZipStream和DeflateStream类,它们分别实现了gzip和deflate压缩算法。 实现内存Stream压缩JPG图像的过程如下: 1. *...
在C++中,实现压缩和解压缩功能通常会涉及到一些开源库,如ZLIB、Libarchive、minizip等。其中,ZLIB是一个广泛使用的库,它提供了基本的压缩和解压缩功能,基于DEFLATE算法。DEFLATE是一种混合了LZ77压缩和霍夫曼...
总结来说,这个基于C#的Compress and Decompress类库源码主要关注于利用.NET Framework的GZipStream类实现文件的压缩和解压缩,这对于C#开发者来说,是一个很好的学习资源,可以帮助他们掌握数据压缩技术,并在实际...
C#提供了多种库和API来实现这个功能,其中最常用的是System.IO.Compression命名空间,它包含了GZipStream和DeflateStream类,用于GZIP和DEFLATE压缩算法,还有ZipArchive类用于处理ZIP文件格式。 一、GZIP和DEFLATE...
"前端pako压缩与解压缩"这个主题主要关注如何在JavaScript环境下利用pako库来实现这一功能。Pako是一个高效的,开源的Gzip/Deflate库,它允许开发者在浏览器端进行数据压缩和解压缩,从而提高网页性能。 首先,我们...
在VB(Visual Basic)编程环境中,我们可以利用第三方库或者.NET框架自带的功能来实现文件的压缩和解压缩。这里主要讨论如何使用.NET Framework的System.IO.Compression命名空间中的GZipStream和DeflateStream类来...
它通过使用内置的类库,如GZipStream,对XML格式的数据进行压缩,从而减少网络带宽消耗,提高数据传输效率。 在.NET Framework中,GZipStream是一个用于压缩和解压缩数据的流类,它是System.IO.Compression命名空间...
本篇文章将详细探讨C#如何实现压缩和解压技术。 一、基础理论 1. 压缩技术:文件压缩是通过特定算法将文件大小减小的过程,目的是减少存储空间或加快传输速度。常见的压缩格式有ZIP、GZIP、7Z等。 2. 解压缩技术:...
在C# Core中,我们可以使用`System.IO.Compression.GZipStream`或`System.IO.Compression.DeflateStream`类来对图片的二进制数据进行无损压缩,但这种方法不改变图片本身的格式,只压缩存储的二进制数据。...
总的来说,使用C#和WinForm创建文件夹的压缩解压工具,虽然涉及到的技术并不深奥,但实现一个完整且用户体验良好的应用仍然需要考虑很多细节,包括错误处理、用户交互以及性能优化。通过不断地实践和学习,你可以...
在.NET框架中,C#提供了内置的压缩和解压缩功能,主要通过`System.IO.Compression`命名空间下的类来实现。这个命名空间包含了多种压缩算法,如GZip和Deflate,可以有效地处理大文件,即使文件大小超过2GB。本文将...
主要类包括`GZipStream`(用于gzip格式)和`DeflateStream`(用于deflate格式),以及我们关注的`ZipArchive`类,它支持ZIP文件的读写。 2. **ZipArchive类**: `ZipArchive`类是处理ZIP文件的核心,可以创建、...
在C#编程环境中,压缩和解压缩文件是...理解这两种流的工作原理以及如何与FileStream结合使用,将有助于在项目中高效地处理文件压缩问题。无论是单一文件还是批量文件,都可以通过封装和扩展基础代码来满足特定需求。
Huffman编码的优点在于它是一种自适应编码,即编码长度与字符出现的频率成反比,频繁的字符编码较短,不常出现的字符编码较长,从而实现整体的数据压缩。然而,Huffman编码并不适合对已知分布的固定数据进行压缩,...