/// <summary> /// 压缩数据流。 /// </summary> /// <param name="algorithm">要使用的压缩算法。CompressionAlgorithms 类中提供了常用的压缩算法。</param> /// <param name="inputStream">指定输入流。</param> /// <param name="inputCount">输入流的长度,或 -1 以代表读至流的末尾。</param> /// <param name="outputStream">指定输出流。</param> /// <returns></returns> /// <exception cref="System.ArgumentNullException"></exception> public static void Compression(CompressionAlgorithm algorithm, CompressionMode mode, Stream inputStream, int inputCount, Stream outputStream) { if (algorithm == null || inputStream == null || outputStream == null) throw new ArgumentNullException(); if (inputCount == 0) return; var countRead = 0; var lastTimeRead = 0; var inputBuffer = new byte[Compressor.ChunkSize]; do { lastTimeRead = inputStream.Read(inputBuffer, 0, inputCount == -1 ? Compressor.ChunkSize : Math.Min(Compressor.ChunkSize, (inputCount - countRead))); if (lastTimeRead != 0) { countRead += lastTimeRead; if (mode == CompressionMode.Compress) { var ret = algorithm.CompressFinalBlock(inputBuffer, 0, lastTimeRead); outputStream.Write(ret, 0, ret.Length); } else { var ret = algorithm.DecompressFinalBlock(inputBuffer, 0, lastTimeRead); outputStream.Write(ret, 0, ret.Length); } } } while ((countRead < inputCount && inputCount != -1) || (inputCount == -1 && lastTimeRead != 0)); }
/// <summary> /// 压缩数据流。 /// </summary> /// <param name="algorithm">要使用的压缩算法。CompressionAlgorithms 类中提供了常用的压缩算法。</param> /// <param name="inputBuffer">指定输入缓冲区。</param> /// <returns></returns> /// <exception cref="System.ArgumentNullException"></exception> public static byte[] Compression(CompressionAlgorithm algorithm, CompressionMode mode, byte[] inputBuffer) { if (algorithm == null || inputBuffer == null) throw new ArgumentNullException(); if (mode == CompressionMode.Compress) return algorithm.CompressFinalBlock(inputBuffer, 0, inputBuffer.Length); else return algorithm.DecompressFinalBlock(inputBuffer, 0, inputBuffer.Length); }