我目前在做的项目要加入压缩和解压缩我在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?

解决方案 »

  1.   

    给你个提示
    网上有现成的开源的代码ICSharpCode.SharpZipLib.dll
    搜索一下吧,看看提示就会使用了www.51aspx.com这个网站上面也有,可以去搜索
      

  2.   

    ReadAllBytesFromStream这个方法里面是100个字节一次循环读的
    所以byte[] decompressedBuffer = new byte[buffer.Length + 100];
    以便能保证所有的byte都能读出
      

  3.   

    可是我在解压缩时根本不知道buffer.Length这个长度,只是给我一个压缩的byte[],如何才能解开?
    如能提示,愿意提高分回赠
      

  4.   

    xiaotupansy(分基本靠接)
    你确定这个是用2.0写的吗?
      

  5.   

    解压缩时只要把那个byte[]传给解压缩器就可以了,还是用流的方式读出解压缩的内容
      

  6.   

    soaringbird() 
    可是MSDN上的需要的参数是压缩的流和未压缩的BYTE,
    真不知道有未压缩的数据还叫什么解压缩
      

  7.   

    byte[] decompressedBuffer = new byte[buffer.Length + 100];
    在这一句时,我没有未压缩数据,如何能知道这个长度该有多长?
    没有这个decompressedBuffer 就相当于没有
    public static int ReadAllBytesFromStream(Stream stream, byte[] buffer) 中的第二个参数嘛
      

  8.   

    byte[] decompressedBuffer = new byte[buffer.Length + 100];
    int totalCount = GZipTest.ReadAllBytesFromStream(zipStream, decompressedBuffer);decompressedBuffer是用来存放解压缩后的数据的,在这个例子里面它是用了原先没有压缩过的原始数据的那个buffer.Length加上了100,其实不加也够用,但是如果没有原始数据的长度,那就用动态数组,边读边增加容量。
      

  9.   

    更改数组大小的方法如下:
    using System;public class SamplesArray  
    {
        public static void Main()  {
     
            // Create and initialize a new string array.
            String[] myArr = {"The", "quick", "brown", "fox", "jumps", 
                "over", "the", "lazy", "dog"};
     
            // Display the values of the array.
            Console.WriteLine( 
                "The string array initially contains the following values:");
            PrintIndexAndValues(myArr);        // Resize the array to a bigger size (five elements larger).
            Array.Resize(ref myArr, myArr.Length + 5);        // Display the values of the array.
            Console.WriteLine("After resizing to a larger size, ");
            Console.WriteLine("the string array contains the following values:");
            PrintIndexAndValues(myArr);        // Resize the array to a smaller size (four elements).
            Array.Resize(ref myArr, 4);        // Display the values of the array.
            Console.WriteLine("After resizing to a smaller size, ");
            Console.WriteLine("the string array contains the following values:");
            PrintIndexAndValues(myArr);
        }    public static void PrintIndexAndValues(String[] myArr)  {
            for(int i = 0; i < myArr.Length; i++)  
            {
                Console.WriteLine("   [{0}] : {1}", i, myArr[i]);
            }
            Console.WriteLine();
        }
    }/* 
    This code produces the following output.The string array initially contains the following values:
       [0] : The
       [1] : quick
       [2] : brown
       [3] : fox
       [4] : jumps
       [5] : over
       [6] : the
       [7] : lazy
       [8] : dogAfter resizing to a larger size, 
    the string array contains the following values:
       [0] : The
       [1] : quick
       [2] : brown
       [3] : fox
       [4] : jumps
       [5] : over
       [6] : the
       [7] : lazy
       [8] : dog
       [9] :
       [10] :
       [11] :
       [12] :
       [13] :After resizing to a smaller size, 
    the string array contains the following values:
       [0] : The
       [1] : quick
       [2] : brown
       [3] : fox*/你也可以只用一个固定的buffer一段一段读取,每次读取后写到另外一个Stream里
      

  10.   

    我之前写过一个类似的#region 数据解压缩
        /// <summary>
        /// 将目标数据解压缩
        /// </summary>
        /// <param name="objective">目标数据</param>
        /// <returns>解压缩后的数据</returns>
        public byte[] DataDecompression(byte[] objective)
        {
            byte[] byteDecompression = null;        System.IO.MemoryStream memoryStream = new MemoryStream();
            memoryStream.Position = 0;
            memoryStream.Write(objective, 0, objective.Length);
            System.IO.Compression.GZipStream decompressionZipStream = new GZipStream(memoryStream, CompressionMode.Decompress);        int total = 0;
            byte[] tempByte = null;
            while (true)
            {
                tempByte = new byte[total + 1];
                int resultInt = decompressionZipStream.Read(tempByte, total, 1);
                if (resultInt == 0)
                    total++;
                break;
            }
            byteDecompression = new byte[memoryStream.Length];
            memoryStream.Position = 0;
            memoryStream.Read(byteDecompression, 0, (int)memoryStream.Length);       // decompressionZipStream.Read(byteDecompression, 0, byteDecompression.Length);
            return byteDecompression;
        }
        #endregion
      

  11.   

    我先试一下再回你jiankeyunxiao()
      

  12.   

    忘了,对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;
            }
      

  13.   

    jiankeyunxiao() 
    十分感谢,搞定