C# GZipStream C压缩/解压缩中的问题#
有人能帮助理解下面代码中的错误吗? 如图所示,我只是试图压缩和解压缩内存流C# GZipStream C压缩/解压缩中的问题#,c#,.net,visual-studio,C#,.net,Visual Studio,有人能帮助理解下面代码中的错误吗? 如图所示,我只是试图压缩和解压缩内存流 //read var memStream = new MemoryStream(); using (Stream fs = File.Open(@"..\..\..\TextFile.txt", FileMode.Open)) { var byteArray = new byte[1 * 1024];
//read
var memStream = new MemoryStream();
using (Stream fs = File.Open(@"..\..\..\TextFile.txt", FileMode.Open)) {
var byteArray = new byte[1 * 1024];
int len = 0;
while ((len = fs.Read(byteArray, 0, byteArray.Length)) > 0) {
memStream.Write(byteArray, 0, len);
}
}
Console.WriteLine("read bytes {0}",memStream.Length);
//compress
byte[] compBytes;
using (var memStream2 = new MemoryStream()) {
memStream2.Position = 0;
using (var zipStream = new GZipStream(memStream2, CompressionMode.Compress)) {
memStream.Position = 0;
memStream.CopyTo(zipStream);
compBytes = memStream2.ToArray();
}
}
Console.WriteLine("compressed bytes {0}", compBytes.Length);
//decompress
byte[] decompBytes;
using (var memStream3 = new MemoryStream(compBytes)) {
memStream3.Seek(0, SeekOrigin.Begin);
using (var memStream4 = new MemoryStream()) {
using (var zipStream = new GZipStream(memStream3, CompressionMode.Decompress)) {
zipStream.CopyTo(memStream4);
decompBytes = memStream4.ToArray();
}
}
}
Console.WriteLine("decompressed bytes {0}", decompBytes.Length);
输出:
读取字节6034
压缩字节10
解压缩的字节0在读取目标内存流
之前,必须读取gzip流
或它
试试这个:
//compress
byte[] compBytes;
using (var memStream2 = new MemoryStream()) {
memStream2.Position = 0;
using (var zipStream = new GZipStream(memStream2, CompressionMode.Compress)) {
memStream.Position = 0;
memStream.CopyTo(zipStream);
}
compBytes = memStream2.ToArray(); <--- move it out of the zipstream using to flush it.
}
Console.WriteLine("compressed bytes {0}", compBytes.Length);
//压缩
字节[]个字节;
使用(var memStream2=newmemoryStream()){
memStream2.位置=0;
使用(var zipStream=new GZipStream(memStream2,CompressionMode.Compress)){
memStream.Position=0;
memStream.CopyTo(zipStream);
}
compBytes=memStream2.ToArray();您必须在读取目标内存流之前读取gzip流
或它
试试这个:
//compress
byte[] compBytes;
using (var memStream2 = new MemoryStream()) {
memStream2.Position = 0;
using (var zipStream = new GZipStream(memStream2, CompressionMode.Compress)) {
memStream.Position = 0;
memStream.CopyTo(zipStream);
}
compBytes = memStream2.ToArray(); <--- move it out of the zipstream using to flush it.
}
Console.WriteLine("compressed bytes {0}", compBytes.Length);
//压缩
字节[]个字节;
使用(var memStream2=newmemoryStream()){
memStream2.位置=0;
使用(var zipStream=new GZipStream(memStream2,CompressionMode.Compress)){
memStream.Position=0;
memStream.CopyTo(zipStream);
}
compBytes=memStream2.ToArray();您不能创建2个压缩和解压缩的函数:
public static byte[] Compress(byte[] data)
{
MemoryStream output = new MemoryStream();
using (DeflateStream dstream = new DeflateStream(output, CompressionLevel.Optimal))
{
dstream.Write(data, 0, data.Length);
}
return output.ToArray();
}
public static byte[] Decompress(byte[] data)
{
MemoryStream input = new MemoryStream(data);
MemoryStream output = new MemoryStream();
using (DeflateStream dstream = new DeflateStream(input, CompressionMode.Decompress))
{
dstream.CopyTo(output);
}
return output.ToArray();
}
如果要压缩和解压缩文本文件,请使用以下命令:
string file = File.ReadAllText("TEXT FILE LOCATION HERE");
byte[] compressed = Compress(Encoding.ASCII.GetBytes(file));
byte[] decompressed = Decompress(compressed);
您不能创建两个压缩和解压缩的函数:
public static byte[] Compress(byte[] data)
{
MemoryStream output = new MemoryStream();
using (DeflateStream dstream = new DeflateStream(output, CompressionLevel.Optimal))
{
dstream.Write(data, 0, data.Length);
}
return output.ToArray();
}
public static byte[] Decompress(byte[] data)
{
MemoryStream input = new MemoryStream(data);
MemoryStream output = new MemoryStream();
using (DeflateStream dstream = new DeflateStream(input, CompressionMode.Decompress))
{
dstream.CopyTo(output);
}
return output.ToArray();
}
如果要压缩和解压缩文本文件,请使用以下命令:
string file = File.ReadAllText("TEXT FILE LOCATION HERE");
byte[] compressed = Compress(Encoding.ASCII.GetBytes(file));
byte[] decompressed = Decompress(compressed);
关闭zip流后调用decompressedStream.Seek()
也很重要。否则,生成的“解压缩”流的大小比预期的小
//decompression:
var compressedStream = new MemoryStream( myByteArray );
var decompressedStream = new MemoryStream();
var zipStream = new GZipStream( compressedStream,
CompressionMode.Decompress, true); //NOTICE 'true': will close manually, later.
zipStream.CopyTo( decompressedStream );
zipStream.Close();
decompressedStream.Seek(0, SeekOrigin.Begin); //NOTICE THIS LINE, after .Close()
正如其他人提到的,调用.Close()
后,我们可以访问它的数组,等等:
var loadable = myBinaryFormatter.Deserialize(decompressedStream) as MyFancyObject;
decompressedStream.Close();
关闭zip流后调用decompressedStream.Seek()
也很重要。否则,生成的“解压缩”流的大小比预期的小
//decompression:
var compressedStream = new MemoryStream( myByteArray );
var decompressedStream = new MemoryStream();
var zipStream = new GZipStream( compressedStream,
CompressionMode.Decompress, true); //NOTICE 'true': will close manually, later.
zipStream.CopyTo( decompressedStream );
zipStream.Close();
decompressedStream.Seek(0, SeekOrigin.Begin); //NOTICE THIS LINE, after .Close()
正如其他人提到的,调用.Close()
后,我们可以访问它的数组,等等:
var loadable = myBinaryFormatter.Deserialize(decompressedStream) as MyFancyObject;
decompressedStream.Close();
您可以将代码简化一点:只需使用fs.CopyTo(memStream)即可,而无需分块读取文件;此外,在构建新的MemoryStream后,您无需查找到流的开头。您可以将代码简化一点:无需分块读取文件,只需使用fs.CopyTo(memStream);此外,在构建一个新的MemoryStream之后,您不需要寻找流的开头。