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