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

本文关键字:压缩 转换 未压缩 何使用 GZipStream | 更新日期: 2023-09-27 17:58:45

根据各种示例,我已经能够将内存流转换为压缩流,然后转换为字节数组以保存在数据库中,但我在使用其他方法时遇到了问题。以下是我目前所掌握的。。。

...
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接缝更有意义,但未压缩的流总是空的

附言:我真正想要的是像这样简单的东西

MemoryStream compressed = GZipStream(uncompressed, Compress)
MemoryStream upcompressed = GZipStream(compressed, Decompress)

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

此代码示例有效。第一部分只是得到一个压缩的字节数组。第二部分演示了如何在代码中创建压缩流,可以多次写入。但是位置必须设置为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);