如何使用GZipStream将压缩流转换为c#中的未压缩流

时间:2016-07-25 22:54:48

标签: c# gzipstream

根据各种样本,我已经能够将内存流转换为压缩流,然后转换为字节数组以保存在数据库中,但是我却遇到了麻烦。这是我到目前为止所得到的......

...
using (MemoryStream compressedStream = new MemoryStream()) {
    ...some code that builds the compressedStream for an undetermined
    number of byteArrays from a database
    using (MemoryStream uncompressedStream = new MemoryStream()) {
        // method 1
        using (GZipStream unzippedStream = new GZipStream(compressedStream, CompressionMode.Decompress)) {
            unzippedStream.CopyTo(uncompressedStream);
        }
        // method 2
        using (GZipStream unzippedStream = new GZipStream(uncompressedStream, CompressionMode.Decompress)) {
            compressedStream.CopyTo(unzippedStream);
        }
        ... do something with uncompressedStream
    }
}

方法1接缝遵循我在此处看到的示例,但会导致错误"流不支持写入"

方法2接缝更有意义,但未压缩的流总是空的

P.S。我真正想要的是像

这样简单的东西
MemoryStream compressed = GZipStream(uncompressed, Compress)
MemoryStream upcompressed = GZipStream(compressed, Decompress)

1 个答案:

答案 0 :(得分:0)

此代码示例有效。第一部分是获取压缩字节数组。第二部分演示了如何在代码中创建压缩流,可以多次执行写入。但该位置必须设置为0。

byte[] compressed;
string output;

using (var outStream = new MemoryStream()) {
    using (var tinyStream = new GZipStream(outStream, CompressionMode.Compress))
    using (var mStream = new MemoryStream(Encoding.UTF8.GetBytes("This is a test"))) {
        mStream.CopyTo(tinyStream);
    }
    compressed = outStream.ToArray();
}

using (var compressedStream = new MemoryStream()) {
    // can do multiple writes here to create the compressed stream
    compressedStream.Write(compressed, 0, compressed.Length);
    compressedStream.Flush();
    compressedStream.Position = 0;
    using (var unzippedStream = new GZipStream(compressedStream, CompressionMode.Decompress))
    using (var uncompressedStream = new MemoryStream()) {
        unzippedStream.CopyTo(uncompressedStream);
        output = Encoding.UTF8.GetString(uncompressedStream.ToArray());
    }
}

Console.WriteLine(output);
相关问题