我目前在做的项目要加入压缩和解压缩我在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?
不够再追加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?
解决方案 »
- 为什么SQL语句在C#中会提示(常量中有换行符,应输入;无效的表达式项“,”)
- 有谁用过winform里的devexpress grid?
- [求助]C# Winform中Form1和UserControl1之间怎么传值?
- 客户端外网访问服务器共享文件夹访问用户控制
- ####如何获得Javascript 里 confirm的返回参数
- 把一小段C++程序转成C#格式的,串口方面。
- 个人使用.NET开发了一个送水管理软件,希望大家多多提意见!
- 2个不同窗体的2个dataGridView控制相同数据源问题
- 如何将combobox1中数据安全赋给combobox2中。
- 请问:如何实现 PSD 格式(PHOTOSHOP格式) 的读取。(最好可以写入)
- 求助,.net问题
- WinForm还是WebForm你如何选择?
网上有现成的开源的代码ICSharpCode.SharpZipLib.dll
搜索一下吧,看看提示就会使用了www.51aspx.com这个网站上面也有,可以去搜索
所以byte[] decompressedBuffer = new byte[buffer.Length + 100];
以便能保证所有的byte都能读出
如能提示,愿意提高分回赠
你确定这个是用2.0写的吗?
可是MSDN上的需要的参数是压缩的流和未压缩的BYTE,
真不知道有未压缩的数据还叫什么解压缩
在这一句时,我没有未压缩数据,如何能知道这个长度该有多长?
没有这个decompressedBuffer 就相当于没有
public static int ReadAllBytesFromStream(Stream stream, byte[] buffer) 中的第二个参数嘛
int totalCount = GZipTest.ReadAllBytesFromStream(zipStream, decompressedBuffer);decompressedBuffer是用来存放解压缩后的数据的,在这个例子里面它是用了原先没有压缩过的原始数据的那个buffer.Length加上了100,其实不加也够用,但是如果没有原始数据的长度,那就用动态数组,边读边增加容量。
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里
/// <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
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;
}
十分感谢,搞定