System.IO.Compression メモ

class Program
{
    static void Main(string[] args)
    {
        byte[] source = new byte[] { 0, 1, 2, 3, 4 };
        byte[] compressData;
        byte[] restoreData;

        using (var compressInputStream = new MemoryStream(source))
        using (var compressOutputStream = new MemoryStream())
        {
            using (var compressStream = new GZipStream(compressOutputStream, CompressionMode.Compress, true))
            {
                Transfer(compressInputStream, compressStream, 100);
            }
            compressData = compressOutputStream.ToArray();
        }

        using (var decompressInputStream = new MemoryStream(compressData))
        using (var decompressOutputStream = new MemoryStream())
        {
            using (var decompressStream = new GZipStream(decompressInputStream, CompressionMode.Decompress, true))
            {
                Transfer(decompressStream, decompressOutputStream, 100);
            }
            restoreData = decompressOutputStream.ToArray();
        }
    }

    static void Transfer(Stream inputStream, Stream outputStream, int bufferSize)
    {
        byte[] buffer = new byte[bufferSize];

        while (true)
        {
            int readCount = inputStream.Read(buffer, 0, bufferSize);
            if (readCount == 0)
            {
                break;
            }
            outputStream.Write(buffer, 0, readCount);
        }
    }
}

圧縮時、GZipStream を Close することで、圧縮データが完成することに注意。
Close するまでは、基になるストリームに未完のデータが入っている。
Flush メソッド呼び出してもダメ。