压缩和解压在.net结束与零解压数组
问题描述:
我试图压缩和解压缩内存流发送它通过TCP连接。 在下面的代码中,我会在压缩之后立即进行解压缩,以使其首先工作。 我做了什么我最终与一个devompressed缓冲区机智全零和在行 int read = Decompress.Read(buffie,0,buffie.Length); 似乎读取了0个字节。压缩和解压在.net结束与零解压数组
有没有人有线索有什么问题?
bytesRead = ms.Read(buf, 0, i);
MemoryStream partialMs = new MemoryStream();
GZipStream gZip = new GZipStream(partialMs, CompressionMode.Compress);
gZip.Write(buf, 0, buf.Length);
partialMs.Position = 0;
byte[] compressedBuf = new byte[partialMs.Length];
partialMs.Read(compressedBuf, 0, (int)partialMs.Length);
partialMs.Close();
byte[] gzBuffer = new byte[compressedBuf.Length + 4];
System.Buffer.BlockCopy(compressedBuf, 0, gzBuffer, 4, compressedBuf.Length);
System.Buffer.BlockCopy(BitConverter.GetBytes(buf.Length), 0, gzBuffer, 0, 4);
using (MemoryStream mems = new MemoryStream())
{
int msgLength = BitConverter.ToInt32(gzBuffer, 0);
byte[] buffie = new byte[msgLength];
mems.Write(gzBuffer, 4, gzBuffer.Length - 4);
mems.Flush();
mems.Position = 0;
using (GZipStream Decompress = new GZipStream(mems, CompressionMode.Decompress, true))
{
int read = Decompress.Read(buffie, 0, buffie.Length);
Decompress.Close();
}
}
答
底部
您的实施可能会使用一些工作。似乎有一些混淆,哪些流应该用在哪里。这里是工作的例子,让你开始..在这个MSDN page
底部
看到用户的内容
var original = new byte[65535];
var compressed = GZipTest.Compress(original);
var decompressed = GZipTest.Decompress(compressed);
using System.IO;
using System.IO.Compression;
public class GZipTest
{
public static byte[] Compress(byte[] uncompressedBuffer)
{
using (var ms = new MemoryStream())
{
using (var gzip = new GZipStream(ms, CompressionMode.Compress, true))
{
gzip.Write(uncompressedBuffer, 0, uncompressedBuffer.Length);
}
byte[] compressedBuffer = ms.ToArray();
return compressedBuffer;
}
}
public static byte[] Decompress(byte[] compressedBuffer)
{
using (var gzip = new GZipStream(new MemoryStream(compressedBuffer), CompressionMode.Decompress))
{
byte[] uncompressedBuffer = ReadAllBytes(gzip);
return uncompressedBuffer;
}
}
private static byte[] ReadAllBytes(Stream stream)
{
var buffer = new byte[4096];
using (var ms = new MemoryStream())
{
int bytesRead = 0;
do
{
bytesRead = stream.Read(buffer, 0, buffer.Length);
if (bytesRead > 0)
{
ms.Write(buffer, 0, bytesRead);
}
} while (bytesRead > 0);
return ms.ToArray();
}
}
}
答
你不关闭GzipStream
你写,所以它可能是所有缓冲。我建议你在写完数据后关闭它。
顺便说一下,您可以比当前代码更容易地从MemoryStream
中获取数据:使用MemoryStream.ToArray
。
+0
你是对的,乔恩,仔细看看发布的代码将揭示一些更基本的问题。 – 2010-02-16 08:09:28
PS:发布审查断码的预期和接受。发布_incomplete_ _broken_代码通常会让你无处可寻。这就像打电话给医生,问他你的猫有什么问题。只是说... ;-) – 2010-02-16 08:07:37