首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

关于2.0里面的解压缩,该如何处理

2012-01-12 
关于2.0里面的解压缩我目前在做的项目要加入压缩和解压缩我在MSDN里看到的关于解压缩的内容有一处不明白为

关于2.0里面的解压缩
我目前在做的项目要加入压缩和解压缩

我在MSDN里看到的关于解压缩的内容有一处不明白为什么,请同志们给我个提示
不够再追加

using   System;
using   System.IO;
using   System.IO.Compression;

public   class   GZipTest
{
public   static   int   ReadAllBytesFromStream(Stream   stream,   byte[]   buffer)  
{
//   Use   this   method   is   used   to   read   all   bytes   from   a   stream.
int   offset   =   0;
int   totalCount   =   0;
while   (true)  
{
int   bytesRead   =   stream.Read(buffer,   offset,   100);  
if   (   bytesRead   ==   0)  
{
break;  
}
offset   +=   bytesRead;
totalCount   +=   bytesRead;  
}
return   totalCount;
}  

public   static   bool   CompareData(byte[]   buf1,   int   len1,   byte[]   buf2,   int   len2)  
{
//   Use   this   method   to   compare   data   from   two   different   buffers.
if   (len1   !=   len2)  
{  
Console.WriteLine( "Number   of   bytes   in   two   buffer   are   different   {0}:{1} ",   len1,   len2);
return   false;
}

for   (   int   i=   0;   i <   len1;   i++)  
{
if   (   buf1[i]   !=   buf2[i])  
{
Console.WriteLine( "byte   {0}   is   different   {1}|{2} ",   i,   buf1[i],   buf2[i]);
return   false;
}
}
Console.WriteLine( "All   bytes   compare. ");
return   true;  
}

public   static   void   GZipCompressDecompress(string   filename)
{
Console.WriteLine( "Test   compression   and   decompression   on   file   {0} ",   filename);
FileStream   infile;
try
{
//   Open   the   file   as   a   FileStream   object.
infile   =   new   FileStream(filename,   FileMode.Open,   FileAccess.Read,   FileShare.Read);
byte[]   buffer   =   new   byte[infile.Length];
//   Read   the   file   to   ensure   it   is   readable.
int   count   =   infile.Read(buffer,   0,   buffer.Length);
if   (   count   !=   buffer.Length)  
{
infile.Close();
Console.WriteLine( "Test   Failed:   Unable   to   read   data   from   file ");  
return;
}
infile.Close();
MemoryStream   ms   =   new   MemoryStream();
//   Use   the   newly   created   memory   stream   for   the   compressed   data.
GZipStream   compressedzipStream   =   new   GZipStream(ms   ,   CompressionMode.Compress,   true);
Console.WriteLine( "Compression ");
compressedzipStream.Write(buffer,   0,   buffer.Length);
//   Close   the   stream.
compressedzipStream.Close();
Console.WriteLine( "Original   size:   {0},   Compressed   size:   {1} ",   buffer.Length,   ms.Length);



//   Reset   the   memory   stream   position   to   begin   decompression.
ms.Position   =   0;
GZipStream   zipStream   =   new   GZipStream(ms,   CompressionMode.Decompress);
Console.WriteLine( "Decompression ");
byte[]   decompressedBuffer   =   new   byte[buffer.Length   +   100];
//   Use   the   ReadAllBytesFromStream   to   read   the   stream.
int   totalCount   =   GZipTest.ReadAllBytesFromStream(zipStream,   decompressedBuffer);
Console.WriteLine( "Decompressed   {0}   bytes ",   totalCount);

if(   !GZipTest.CompareData(buffer,   buffer.Length,   decompressedBuffer,   totalCount)   )  
{
Console.WriteLine( "Error.   The   two   buffers   did   not   compare. ");
}
zipStream.Close();  
}   //   end   try
catch   (InvalidDataException)
{
Console.WriteLine( "Error:   The   file   being   read   contains   invalid   data. ");
}
catch   (FileNotFoundException)
{
Console.WriteLine( "Error:The   file   specified   was   not   found. ");
}
catch   (ArgumentException)
{
Console.WriteLine( "Error:   path   is   a   zero-length   string,   contains   only   white   space,   or   contains   one   or   more   invalid   characters ");
}
catch   (PathTooLongException)
{
Console.WriteLine( "Error:   The   specified   path,   file   name,   or   both   exceed   the   system-defined   maximum   length.   For   example,   on   Windows-based   platforms,   paths   must   be   less   than   248   characters,   and   file   names   must   be   less   than   260   characters. ");
}
catch   (DirectoryNotFoundException)
{
Console.WriteLine( "Error:   The   specified   path   is   invalid,   such   as   being   on   an   unmapped   drive. ");
}
catch   (IOException)
{
Console.WriteLine( "Error:   An   I/O   error   occurred   while   opening   the   file. ");
}
catch   (UnauthorizedAccessException)
{
Console.WriteLine( "Error:   path   specified   a   file   that   is   read-only,   the   path   is   a   directory,   or   caller   does   not   have   the   required   permissions. ");
}
catch   (IndexOutOfRangeException)
{
Console.WriteLine( "Error:   You   must   provide   parameters   for   MyGZIP. ");
}
}
public   static   void   Main(string[]   args)
{
string   usageText   =   "Usage:   MYGZIP   <inputfilename> ";
//If   no   file   name   is   specified,   write   usage   text.
if   (args.Length   ==   0)
{
Console.WriteLine(usageText);
}
else
{
if   (File.Exists(args[0]))
GZipCompressDecompress(args[0]);
}
}
}



这里的关于byte[]   decompressedBuffer   =   new   byte[buffer.Length   +   100];
这一句为什么要   用这个buffer.Length   +   100?

[解决办法]
忘了,对MemoryStream不能这么处理

之前我写的是关于文件流的。

你试一下这个。


public byte[] DataDecompressToBytes(byte[] byteDestination)
{
byte[] byteResult;
MemoryStream memoryStream = new MemoryStream(byteDestination);
System.IO.Compression.DeflateStream decompressionStream = new System.IO.Compression.DeflateStream(memoryStream, CompressionMode.Decompress);
try
{
BinaryFormatter serializer = new BinaryFormatter();
object obj = serializer.Deserialize(decompressionStream);
byteResult = (byte[])obj;
decompressionStream.Close();
memoryStream.Close();
}
catch (Exception e)
{
decompressionStream.Close();
memoryStream.Close();
MessageBox.Show(e.Message);
return null;
}
return byteResult;
}

热点排行